טריגר המחולל טריגרים

20/06/2012

תגובה אחת

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

Use tempdb;

go

 

Create Table T_Try001(I Int);

 

Create Table T_Log(ID Int Identity,

Tbl Sysname,

Dt DateTime Default GetDate());

 

Create  Trigger TR_Try001

        On T_Try001

        After Insert, Update, Delete As

Insert

Into    T_Log(Tbl)

Select  'T_Try001';

Go

כעת נוסיף שורה לטבלה T_Try001 ונוודא שהמערכת תקינה:

Insert

Into   T_Try001

Select 5;

 

Select * From T_Try001;

Select * From T_Log;

clip_image002

לטבלה T_Try001 התווספה שורה, וטבלת הלוג T_Log עודכנה לגבי כך.

עד כאן- תזכורת כיצד ניתן להשתמש בטריגר לתיעוד שינויים לטבלת לוג.

הבעייה היא שיש הרבה טבלאות מהסוג של T_Try001 ולכל אחת יש לזכור ליצור טריגר כשיוצרים אותה.. זה לא סוף העולם והרבה דברים צריכים לזכור אם רוצים לעבוד מסודר ובהתאם לנהלים, אבל אם אפשר לחסוך בעבודה ולהעמיס פחות על הזכרון- אז למה לא? ניצור טריגר ברמת הדטבייס שבכל פעם שתיווצר טבלה בשם T_Try… הוא באופן אוטומטי יצור לה טריגר ברמת הטבלה שיעדכן את טבלת הלוג לאחר כל שינוי:

Create  Trigger TriggersGenerator

        On Database

        For Create_Table As

Declare @Tbl Sysname,

        @SQL Varchar(Max);

Select  @Tbl=EventData().value('(/EVENT_INSTANCE/ObjectName)[1]','VarChar(Max)')

If @Tbl Like 'T_Try[0123456789][0123456789][0123456789]' --T_Try & 3 digits

        Begin

        Select @SQL='Create Trigger '+IsNull(Stuff(@Tbl,1,1,'TR'),'Null')

                +Char(13)+' On '+@Tbl

                +Char(13)+' After Insert, Update, Delete As'

                +Char(13)+'Insert'

                +Char(13)+'Into T_Log(Tbl)'

                +Char(13)+'Select '''+IsNull(@Tbl,'Null')+''';'

Print @SQL;

Exec(@SQL);

End

וכעת ניצור טבלה דומה בשם T_Try002, נוסיף לה שורה, ונוודא שטבלת הלוג התעדכנה- אות ומופת שעם יצירת הטבלה נוצר לה גם טריגר:

Create Table T_Try002(I Int);

Insert

Into    T_Try002

Select  27;

 

Select  * From T_Try002;

Select  * From T_Log;

clip_image004

כמובן אם ניצור טבלאות ששמן הוא T_Tryabc (כאשר abc הן שלוש ספרות) – לא יווצר טריגר על הטבלה, בהתאם לתנאי שבטריגר שעל הדטבייס.

לסיום- נמחק חיש את כל האובייקטים שיצרנו לפני שה-DBA יתעצבן שאנחנו מנפחים לו את ה-tempdb בשטויות:

Drop Trigger TriggersGenerator On Database;

Drop Table T_Try001;

Drop Table T_Try002;

Drop Table T_Log;

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

תגובה אחת

  1. איתן21/06/2012 ב 07:07

    מגניב !

    הגב