08-07-2008, 17:52
|
|
|
חבר מתאריך: 08.05.08
הודעות: 32
|
|
בעיה עם טריגר של update
אני כותב טריגר שמבצע איזו שהיא פעולה במקרה של update .
יש לי איתו שתי בעיות:
הראשונה והיותר דחופה היא שלפעמים מתבצע update גם שלא לצורך ז"א שאין שוב הבדל בשורה לפני הupdate ולאחריו
(אל תשאלו אותי למה זה קורה כי ככה זה! זו מערכת שנכתבה מזמן בצורה כזו ואני רק משפר אותה)
איך אני יכול לבדוק האם יש הבדל בין מה שהיה למה שעכשיו?
יש לי פיתרון שמבחינה לוגית (שלי) היה אמור לעבוד אבל עושה בעיות
(אם לא היה עדכון ממשי השורות יצטמצמו לשורה אחת בגלל ה union)
קוד:
DECLARE @iChangeData int
SET @iChangeData = (select count(*) from (select * from inserted union select * from deleted) )
מה יכולה להיות הבעיה ו/או איך ניתן לעשות את זה בצורה שונה?
דבר שני:
היום הטריגר יכול לעבוד רק אם עושים update לשורה אחת
אם מנסים לעשות update לשתי שורות, מתקבלת הודעת שגיאה (והבעיה היא שהטבלה inserted מחזירה במצב זה יותר משורה אחת)
איך אפשר להתאים את הטריגר שיוכל לעבוד גם עם עדכון של יותר משורה אחת?
אני מצרף את מה שכתבתי בתקווה שלמישהו יהיה זמן, כח, וחשק לעיין בה ולכתוב לי את הערותיו והארותיו
תודה רבה
קוד:
CREATE TRIGGER [Update_new_data] ON [dbo].[Client_for_msf]
FOR UPDATE
AS
BEGIN
DECLARE @callsId int
DECLARE @new_data int
DECLARE @new_data_old int
DECLARE @iChangeData int
SET @callsId =(select callsId FROM inserted)
SET @new_data =isnull((select new_data FROM inserted ),0)
SET @new_data_old =isnull((select new_data FROM deleted ),0)
SET @iChangeData = (select count(*) from (select * from inserted union select * from deleted) )
if @new_data_old = @new_data and @iChangeData > 1
BEGIN
UPDATE Client_for_msf set new_data = 1 where callsId = @callsId
END
END
הסבר קטן על הטריגר: תפקידו לעדכן בכל מצב בו יש איזה שינוי בשורה שדה בשם new_data חוץ כמובן במקרה שהשדה new_data עודכן
|