top of page
Writer's picture Geri Reshef

סקריפט של כל הטריגרים

Updated: Nov 22, 2023

כיצד יוצרים סריפט של כל הטריגרים (טריגרים על טבלאות!)?

משימה שקיבלתי לפני כמה זמן: בדטבייס היו כ-100 טבלאות שלרובן היה טריגר, והיה צורך לתקן את כולם. הפתרון הראשון שחשבו עליו היה לעבור טבלה אחר טבלה ב-SSMS, לעשות סקריפט של הטריגר שלה, לתקן ולהריץ:


זו כמובן עבודת נמלים, אבל התלבטתי אם שווה להשקיע זמן בלמצוא פתרון יעיל יותר, כזה שייצור לי סקריפט של כל הטריגרים, כך שאוכל לתקן את הטעות הזהה בכולם על ידי חיפוש והחלפה בסקריפט טקסטואלי, בשעה שלתקן 100 טריגרים בשיטה הסיזיפית בקצב של 1-2 טריגרים בדקה - יקח לי קצת יותר משעה..

אני בטוח שיש פתרונות בשפע באינטרנט, אבל תמיד אני מוצא את עצמי מבזבז זמן בלדבג סקריפט שלכאורה אמור היה לעבוד - שגר ושכח..

הפתרון הנכון הוא לשלוף את פקודות ה-Create של הטריגרים מטבלאות המערכת, למשל כך:

Select name TriggerName,

              OBJECT_SCHEMA_NAME(parent_id) SchemaName, 

              OBJECT_NAME(parent_id) TableName,

              OBJECT_DEFINITION(object_id) as TriggerCode

From   sys.triggers;

הקוד של הטריגר נמצא בעמודה הימנית. אם כשמעתיקים את הקוד ל-SSMS הוא מופיע כולו בשורה אחת, יש לשנות את ההגדרות ב-Tools => Options => Query Resultd => SQL Server => Results to Grid (ולפתוח חלון Query חדש):

אופצייה נוספת, בעיקר אם רוצים להפוך את התהליך לאוטומטי (בעזרת ג'וב למשל), הוא שימוש בסקריפט ה-PowerShell שלהלן.

אינני מומחה ל-PS, וככזה אינני מתלהב מסקריפטים שאחרים כתבו, ושאם משהו קטן לא יעבוד בהם - אעמוד חסר אונים ולא אדע מה לעשות. אני מקווה שזה לא יקרה עם הסקריפט שלי שאותו הרצתי בהצלחה אצלי בלפטופ על התקנה מקומית של SQL Server.

פותחים את ה-PS דרך זכוכית המגדלת שבפינה התחתונה (לכתוב PowerShell) והוא נפתח בערך כך:


מעתיקים אילו את הקוד הבא:

Cls


$servername = 'localhost';

$dbname = 'Try001';

$scriptpath = 'C:\Users\GeriReshef\Downloads\PowerShellTablesScripts';


[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO") | Out-Null

[System.Reflection.Assembly]::LoadWithPartialName("System.Data") | Out-Null

$srv = new-object "Microsoft.SqlServer.Management.SMO.Server" $serverName


$srv.SetDefaultInitFields([Microsoft.SqlServer.Management.SMO.View], "IsSystemObject")


$db = New-Object "Microsoft.SqlServer.Management.SMO.Database"


$db = $srv.Databases[$dbname]


$scr = New-Object "Microsoft.SqlServer.Management.Smo.Scripter"


$deptype = New-Object "Microsoft.SqlServer.Management.Smo.DependencyType"


$scr.Server = $srv


$options = New-Object "Microsoft.SqlServer.Management.SMO.ScriptingOptions"


$options.Default = $false

$options.ToFileOnly = $true

$options.AppendToFile = $true

$options.Triggers = $true;


# Set options for SMO.Scripter

$scr.Options = $options


$Tables = $db.Tables | where {$_.IsSystemObject -eq $false}

$options.FileName = $scriptpath + "\Triggrs.sql"


New-Item $options.FileName -type file -force | Out-Null

Foreach ($Table in $Tables) {


if ($Tables -ne $null) {

$scr.Script($Table)

}

}

את שלוש השורות שאצלי מסומנות במרקר מתקנים:

  • $servername שם השרת

  • $dbname שם הדטבייס

  • $scriptpath המחיצה בה ישמר הקובץ עם הסקריפטים

לוחצים על האייקון הירוק או <F5>


הסקריפט אמור חהופיע במחיצה בה בחרנו בתור Triggr.sql.

בהצלחה!

0 comments

Recent Posts

See All

Comments


STAY IN TOUCH

Get New posts delivered straight to your inbox

Thank you for subscribing!

bottom of page