更新所有 cmdexec 作業的字元串
有誰知道是否有可能(並且更可取)更新伺服器上作業中的所有 cmdexec 字元串?
我們想更改我們的日誌記錄位置,原則上我認為這可以通過更改
/O "\\LOCATION\file.log"
字元串非常簡單地完成。我可以看到你實際上會怎麼做
USE MSDB GO update dbo.sysjobsteps set [command] = replace([command], '\\OLDLOCATION\... ', '\\NEWLOCATION\... ') WHERE...
但是我已經告訴我你永遠不應該手動更新 sys 表,所以這樣做的想法讓我非常緊張。對於其他任何事情,我會使用 dbo.sp_update_job proc *(http://msdn.microsoft.com/en-gb/library/ms188745.aspx對於那些在這裡尋找其他工作相關的人來說),*但是那個程序似乎無法處理這個。
我有一種預感,這可能是“從不更新系統表”規則的一個例外?我無法想像 cmdexec 字元串隱含在任何進一步的關係中,例如,啟用/禁用狀態顯然是。妄想?
所以我不確定,而且我似乎無法找到答案。有人知道或有這方面的經驗嗎?
謝謝丹
在我看來,這是肯定會從 PowerShell 中受益的操作之一。您需要做的就是收集具有舊字元串(在本例中為舊位置)的作業步驟列表,並將其替換為新字元串(閱讀:新位置)。
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.Smo") | Out-Null $OldLocation = "<YourOldLocation>" $NewLocation = "<YourNewLocation>" $SqlServerName = "localhost" # by default this will look at the local default instance $SqlServer = New-Object Microsoft.SqlServer.Management.Smo.Server($SqlServerName) # loop through all of the SQL Server Agent Jobs on the instance foreach ($Job in $SqlServer.JobServer.Jobs) { # loop through each Job Step on the current Job foreach ($JobStep in $Job.JobSteps) { # test to see if the Job Step Command text contains your original string if ($JobStep.Command.Contains($OldLocation)) { $JobStep | Select-Object Parent, Name, Command # the below two lines would make the change to the new string and apply them #$JobStep.Command = $JobStep.Command.Replace($OldLocation, $NewLocation) #$JobStep.Alter() } } }
注意:這是範常式式碼,應在非生產環境中進行徹底測試。確保備份您以前的數據,並且您確信更改是理想的結果。
所有這些程式碼都會遍歷特定實例上的所有作業。如果作業步驟命令包含某個字元串,那麼它將顯示它屬於哪個作業、步驟的名稱以及包含該字元串的命令。我特意註釋掉了命令修改行,以便程式碼僅實際辨識哪些步驟包含您的字元串。
您還可以通過向
if
塊中添加額外的條件子句來縮小搜尋範圍。例如,如果您只想檢查CmdExec
作業,請添加-and
條件檢查:$JobStep.SubSystem -eq [Microsoft.SqlServer.Management.Smo.Agent.AgentSubSystem]::CmdExec
這只是一種方法。我將再次強調我的觀點:確保您在遠離生產環境的地方測試此理論和執行,並確保您可以通過必要的備份恢復更改。