דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. יצירת טבלאות ראי עם טריגר

יצירת טבלאות ראי עם טריגר

מתוזמן נעוץ נעול הועבר ארכיון code613m
6 פוסטים 3 כותבים 397 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • א מנותק
    א מנותק
    ארכיטקט
    כתב ב נערך לאחרונה על ידי
    #1

    שלום

    יש לי טבלה שמחזיקה נתוני התקשרות עם איש קשר (לצורך העניין מספר פקס)
    טבלה שניה מחזיקה הודעות הנשלחות לאיש קשר.
    בטבלה השניה יש שדה המכיל נתוני התקשרות (למה זה לא מקושר לטבלה הראשונה עם ID בגלל שיקולים של היסטוריה ועוד) והוא מקבל בדרך כלל את הנתונים מהטבלה הראשית.
    כעת כאשר מעדכנים נתוני התקשרות באחת הטבלאות, אני מעוניין שהם ישתקפו בטבלה השניה, הואיל והשינוי הוא שינוי אמיתי, הוא צריך להתבטא בכל המקומות.
    השיטה לעשות זאת באמצעות טריגר, אולם הוא יוצר לולאה אינסופית, ולמרות ש SQL של UPDATE עשיתי תנאי שהערך הקיים שונה מהערך החדש, כך שבסיבוב השני הוא כבר אמור לעצור.
    הנה הקוד:
    טריגר שמעדכן לאחר עדכון של Messages

    if 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)

    אידיאולוגיות גדולות נכנסות למטחנה של עולם המעשה ויוצאות ממנו בפירורים (ווינסטון צ'רצ'יל, סתם סתם, זה שלי)

    תגובה 1 תגובה אחרונה
    0
    • dovidD מנותק
      dovidD מנותק
      dovid ניהול
      כתב ב נערך לאחרונה על ידי
      #2

      כנראה העדכון מושלם רק לאחר סיום הטריגר. ממילא תמיד הoldValue של הטבלה השניה הוא הישן.

      אני חושב שהדרך היא (אם זה נכון לדבר על דרך לתחזוקת טבלאות זהות!) זה להשתמש במשתנה גלובלי כמו שכתבי כאן:
      ראה מה שכתבתי כאן: http://tchumim.com/topic/468

      שם ClickOne ואתה שאלתם מה יקרה עם עדכון בו זמני כשהטריגר מסומן כשלילי.
      אני לא יודע מה התשובה, אבל סבורני (מכה וכמה מקרים) שטריגר עדכון עושה נעילה ברמת טבלה (מה שנותן רושם לגבי נחמדותו).

      פורסם במקור בפורום CODE613 ב23/06/2014 11:25 (+03:00)

      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

      בכל נושא אפשר ליצור קשר dovid@tchumim.com

      תגובה 1 תגובה אחרונה
      1
      • S מנותק
        S מנותק
        softs
        כתב ב נערך לאחרונה על ידי
        #3

        רבותי דיינים מומחים, יש פתרון פשוט :

        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)

        תגובה 1 תגובה אחרונה
        3
        • א מנותק
          א מנותק
          ארכיטקט
          כתב ב נערך לאחרונה על ידי
          #4

          @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
          

          איזו מומחיות!!! שחרר עוד קצת מודיעין.....

          פורסם במקור בפורום CODE613 ב23/06/2014 15:57 (+03:00)

          אידיאולוגיות גדולות נכנסות למטחנה של עולם המעשה ויוצאות ממנו בפירורים (ווינסטון צ'רצ'יל, סתם סתם, זה שלי)

          תגובה 1 תגובה אחרונה
          1
          • א מנותק
            א מנותק
            ארכיטקט
            כתב ב נערך לאחרונה על ידי
            #5

            @דוד ל.ט.

            כנראה העדכון מושלם רק לאחר סיום הטריגר. ממילא תמיד הoldValue של הטבלה השניה הוא הישן.

            ראה כאן איך באמת עובד מסד נתונים.

            פורסם במקור בפורום CODE613 ב23/06/2014 15:59 (+03:00)

            אידיאולוגיות גדולות נכנסות למטחנה של עולם המעשה ויוצאות ממנו בפירורים (ווינסטון צ'רצ'יל, סתם סתם, זה שלי)

            תגובה 1 תגובה אחרונה
            0
            • S מנותק
              S מנותק
              softs
              כתב ב נערך לאחרונה על ידי
              #6

              @ארכיטקט

              @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)

              תגובה 1 תגובה אחרונה
              1

              בא תתחבר לדף היומי!
              • התחברות

              • אין לך חשבון עדיין? הרשמה

              • התחברו או הירשמו כדי לחפש.
              • פוסט ראשון
                פוסט אחרון
              0
              • דף הבית
              • קטגוריות
              • פוסטים אחרונים
              • משתמשים
              • חיפוש
              • חוקי הפורום