Sql-Server

更新所有 cmdexec 作業的字元串

  • March 19, 2013

有誰知道是否有可能(並且更可取)更新伺服器上作業中的所有 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

這只是一種方法。我將再次強調我的觀點:確保您在遠離生產環境的地方測試此理論和執行,並確保您可以通過必要的備份恢復更改。

引用自:https://dba.stackexchange.com/questions/37036