כיצד יוצרים סריפט של כל הטריגרים (טריגרים על טבלאות!)?
משימה שקיבלתי לפני כמה זמן: בדטבייס היו כ-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.
בהצלחה!
Comments