יצירת טבלאות ראי עם טריגר
-
שלום
יש לי טבלה שמחזיקה נתוני התקשרות עם איש קשר (לצורך העניין מספר פקס)
טבלה שניה מחזיקה הודעות הנשלחות לאיש קשר.
בטבלה השניה יש שדה המכיל נתוני התקשרות (למה זה לא מקושר לטבלה הראשונה עם ID בגלל שיקולים של היסטוריה ועוד) והוא מקבל בדרך כלל את הנתונים מהטבלה הראשית.
כעת כאשר מעדכנים נתוני התקשרות באחת הטבלאות, אני מעוניין שהם ישתקפו בטבלה השניה, הואיל והשינוי הוא שינוי אמיתי, הוא צריך להתבטא בכל המקומות.
השיטה לעשות זאת באמצעות טריגר, אולם הוא יוצר לולאה אינסופית, ולמרות ש SQL של UPDATE עשיתי תנאי שהערך הקיים שונה מהערך החדש, כך שבסיבוב השני הוא כבר אמור לעצור.
הנה הקוד:
טריגר שמעדכן לאחר עדכון של Messagesif UPDATE(CommunicationData)-- במקרה ובוצע שינוי בנתוני התקשרות -- ContactsCommunications מעדכן את טבלת UPDATE ContactsCommunications set CommunicationData= i.CommunicationData from ContactsCommunications cc inner join inserted i on cc.ContactID=i.ToContactID inner join deleted d on d.ID=i.ID where d.CommunicationData=cc.CommunicationData and d.CommunicationData<>i.CommunicationData;
טריגר שמעדכן לאחר עדכון של ContactsCommunications:
declare @oldCommontcationData nvarchar (500) = (select top 1 CommunicationData from deleted); -- מעדכן את טבלת הודעות על סמך העדכון כאן if update(CommunicationData) update Messages set CommunicationData = i.CommunicationData from Messages m inner join inserted i on i.ContactID = m.ToContactID (m.CommunicationData is null or m.CommunicationData = '' or m.CommunicationData = @oldCommontcationData) ;
הטריגר הוא "אפטר" אפדייט, אז מה בדיוק לא בסדר??
פורסם במקור בפורום CODE613 ב23/06/2014 10:12 (+03:00)
-
כנראה העדכון מושלם רק לאחר סיום הטריגר. ממילא תמיד הoldValue של הטבלה השניה הוא הישן.
אני חושב שהדרך היא (אם זה נכון לדבר על דרך לתחזוקת טבלאות זהות!) זה להשתמש במשתנה גלובלי כמו שכתבי כאן:
ראה מה שכתבתי כאן: http://tchumim.com/topic/468שם ClickOne ואתה שאלתם מה יקרה עם עדכון בו זמני כשהטריגר מסומן כשלילי.
אני לא יודע מה התשובה, אבל סבורני (מכה וכמה מקרים) שטריגר עדכון עושה נעילה ברמת טבלה (מה שנותן רושם לגבי נחמדותו).פורסם במקור בפורום CODE613 ב23/06/2014 11:25 (+03:00)
-
רבותי דיינים מומחים, יש פתרון פשוט :
IF (( SELECT TRIGGER_NESTLEVEL()) > 1 ) RETURN
וזה מונע הפעלה של טריגר מתוך טריגר בכל ה DB:
EXEC sp_configure 'show advanced options', 1 GO RECONFIGURE GO EXEC sp_configure 'nested triggers', 0 GO RECONFIGURE GO
פורסם במקור בפורום CODE613 ב23/06/2014 11:32 (+03:00)
-
רבותי דיינים מומחים, יש פתרון פשוט :
IF (( SELECT TRIGGER_NESTLEVEL()) > 1 ) RETURN
וזה מונע הפעלה של טריגר מתוך טריגר בכל ה DB:
EXEC sp_configure 'show advanced options', 1 GO RECONFIGURE GO EXEC sp_configure 'nested triggers', 0 GO RECONFIGURE GO
איזו מומחיות!!! שחרר עוד קצת מודיעין.....
פורסם במקור בפורום CODE613 ב23/06/2014 15:57 (+03:00)
-
@softs
רבותי דיינים מומחים, יש פתרון פשוט :IF (( SELECT TRIGGER_NESTLEVEL()) > 1 ) RETURN
וזה מונע הפעלה של טריגר מתוך טריגר בכל ה DB:
EXEC sp_configure 'show advanced options', 1 GO RECONFIGURE GO EXEC sp_configure 'nested triggers', 0 GO RECONFIGURE GO
איזו מומחיות!!! שחרר עוד קצת מודיעין.....
שמחתי לעזור, ואתם מוזמנים לאתגר אותי ... <!-- s:-) --><img src="{SMILIES_PATH}/icon_e_smile.gif" alt=":-)" title="מחייך" /><!-- s:-) -->
פורסם במקור בפורום CODE613 ב23/06/2014 16:33 (+03:00)