ABA


"עזרה במימוש Trigger ב-SQL"
גירסת הדפסה        
קבוצות דיון פיתוח, תיכנות ובניית אתרים נושא #10920 מנהל    סגן המנהל    מפקח   Winner    צל"ש   מומחה  
אשכול מספר 10920
eminem
חבר מתאריך 14.11.03
4348 הודעות, 1 פידבק
   08:53   02.10.12   
אל הפורום  
  עזרה במימוש Trigger ב-SQL  
 
   יש לי את שתי הטבלאות הבאות

CREATE TABLE Customers (
Customer_ID varchar(50) NOT NULL,
ListedTo varchar(50),
PRIMARY KEY (Customer_ID),
FOREIGN KEY (ListedTo) REFERENCES MailListings(Email)

);

CREATE TABLE Registers (
Email Varchar(50) NOT NULL,
FirstN Varchar(20) NOT NULL,
LastN Varchar(20) NOT NULL,
Company Varchar(50) ,
Address1 Varchar(40) NOT NULL,
Address2 Varchar(40),
City Varchar(40) NOT NULL,
UState Varchar(20) NOT NULL,
zip Int NOT NULL,
Phone Varchar(20) NOT NULL,
PRIMARY KEY (Email),
FOREIGN KEY (Email) REFERENCES Customers(Customer_ID)
);

כפי שאתם רואים יש לי מפתח זר מ-Registers ל-Customers ככה שטבלת הלקוחות זה האבא. אני צריך מדי פעם למחוק נתונים ישירות מטבלת הלקוחות ולא מטבלת הרשומים ככה שיכול להיות מצב שהוא לא יתן לי למחוק בגלל המפתח הזר
יצרתי טריגר שבודק בעת מחיקה אם הערך קיים בבן (Registers) ובמידה וכן ימחק משם קודם,זה הטריגר

Create trigger trg3 
--when delete row from Customers, delete from MailListing and Registers
ON .
INSTEAD OF DELETE

AS

DECLARE @id varchar(50)
DECLARE @list varchar(50)
-- Declaring local variables

BEGIN
SELECT @id=Customer_ID,@list=ListedTo from deleted
IF @list IS NOT NULL
begin
DELETE FROM MailListings WHERE Email=@list;
end
IF (EXISTS (SELECT * FROM Registers WHERE Email=@id))
begin
DELETE FROM Registers WHERE Email=@id;
end
DELETE FROM Customers WHERE Customer_ID=@id;
end

הטריגר עובד אבל אם אני אעשה
delete from Customers
הוא ימחק לי אחד אחד למרות שאני רוצה שימחק את כולם
איך אני משנה את זה ככה שזה יעבוד ועדיין ימחוק את כולם בשאילתה הזו?


                                שתף        
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

  האשכול     מחבר     תאריך כתיבה     מספר  
  תשובה ShlomiC 02.10.12 10:14 1
  למה לא להשתמש בדברים המובנים? CaTz 02.10.12 14:08 2
     לא ידעתי שזה קיים, תודה, אגב, זה גם תופס לגבי INSERT? eminem 02.10.12 15:30 3
         לא, זה קיים רק ב-UPDATE וDELETE... CaTz 02.10.12 16:07 4
             אני לא עובד ב-mysql, אני עובד ב- ms sql server 2008 האם זה תומך? eminem 02.10.12 17:11 5
                 תשמע זה בסטנדרט של SQL... CaTz 02.10.12 18:15 6
                     כן עכשיו ראיתי, בכל אופן המון תודה, אני אנסה ליישם את זה eminem 02.10.12 19:08 7

       
ShlomiC
חבר מתאריך 4.1.08
17501 הודעות
   10:14   02.10.12   
אל הפורום  
  1. תשובה  
בתגובה להודעה מספר 0
 
   רשמת
DELETE FROM MailListings WHERE Email=@list;
DELETE FROM Registers WHERE Email=@id;

כאשר מדובר במשתנים שמקבלים מטבלה ויכולים להכיל כמה נתונים .

צריך לרשום ככה:
DELETE FROM MailListings WHERE Email in (SELECT ListedTo from deleted)
DELETE FROM Registers WHERE Email in (SELECT Customer_ID from deleted )
;

במקום כל התוכן של הטריגר


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
CaTz
חבר מתאריך 2.10.04
14537 הודעות
   14:08   02.10.12   
אל הפורום  
  2. למה לא להשתמש בדברים המובנים?  
בתגובה להודעה מספר 0
 
   אתה יכול לכתוב FK, כך שאם אתה מוחק את האבא, הבנים ימחקו אוטומטית.

משהו כזה:

http://stackoverflow.com/questions/2914936/mysql-foreign-key-constraints-cascade-delete


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
eminem
חבר מתאריך 14.11.03
4348 הודעות, 1 פידבק
   15:30   02.10.12   
אל הפורום  
  3. לא ידעתי שזה קיים, תודה, אגב, זה גם תופס לגבי INSERT?  
בתגובה להודעה מספר 2
 
   כאילו אם אני מוסיף בן, אז האבא נוסף אוטומטי?


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
CaTz
חבר מתאריך 2.10.04
14537 הודעות
   16:07   02.10.12   
אל הפורום  
  4. לא, זה קיים רק ב-UPDATE וDELETE...  
בתגובה להודעה מספר 3
 
   ערכתי לאחרונה בתאריך 02.10.12 בשעה 16:12 בברכה, CaTz
 
ואתה יכול לקבוע מה יקרה, CASCADE, מחיקת האב תמחק/תעדכן את הבן
RESTRICT, תמנע מחיקה/עדכון של האבא

ועוד כמה, תקרא קצת על הנושא הזה, זה פשוט.

ד"א, ישר הנחתי שאתה עובד עם Mysql...שים לב,
שב-Mysql רק מנוע INNODB תומך ב-FK וכל הנושא הזה...

הסוגי בסיסי נתונים אחרים, MS, ORACLE וכו', זה קיים אבל נקרא אחרת (לא בהיכרח)...


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
eminem
חבר מתאריך 14.11.03
4348 הודעות, 1 פידבק
   17:11   02.10.12   
אל הפורום  
  5. אני לא עובד ב-mysql, אני עובד ב- ms sql server 2008 האם זה תומך?  
בתגובה להודעה מספר 4
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
CaTz
חבר מתאריך 2.10.04
14537 הודעות
   18:15   02.10.12   
אל הפורום  
  6. תשמע זה בסטנדרט של SQL...  
בתגובה להודעה מספר 5
 
   מי שממש את הנושא של ה-FK חייב לתמוך

פשוט תראה איך זה נקרא שם...

http://rudesyle.wordpress.com/2008/01/28/cascading-deletes-in-sql-server/


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד
eminem
חבר מתאריך 14.11.03
4348 הודעות, 1 פידבק
   19:08   02.10.12   
אל הפורום  
  7. כן עכשיו ראיתי, בכל אופן המון תודה, אני אנסה ליישם את זה  
בתגובה להודעה מספר 6
 
  


                                                         (ניהול: מחק תגובה)
מכתב זה והנלווה אליו, על אחריות ועל דעת הכותב בלבד

תגובה מהירה  למכתב מספר: 
 
___________________________________________________________________

___________________________________________________________________
למנהלים:  נעל | תייק בארכיון | מחק | העבר לפורום אחר | מחק תגובות | עגן אשכול
       



© כל הזכויות שמורות ל-רוטר.נט בע"מ rotter.net