從一個主要作業順序呼叫多個 SQL Server 代理作業的好方法?
我有幾個應該按順序執行的 SQL Server 代理作業。為了對應該執行的作業有一個很好的概述,我創建了一個主作業,它通過呼叫
EXEC msdb.dbo.sp_start_job N'TEST1'
. 立即完成(作業步驟 1),但我希望我的sp_start_job
主要作業等到作業TEST1
完成後再呼叫下一個作業。所以我編寫了這個小腳本,它在呼叫作業後立即開始執行(作業步驟 2),並強制主作業等到子作業完成:
WHILE 1 = 1 BEGIN WAITFOR DELAY '00:05:00.000'; SELECT * INTO #jobs FROM OPENROWSET('SQLNCLI', 'Server=TESTSERVER;Trusted_Connection=yes;', 'EXEC msdb.dbo.sp_help_job @job_name = N''TEST1'', @execution_status = 0, @job_aspect = N''JOB'''); IF NOT (EXISTS (SELECT top 1 * FROM #jobs)) BEGIN BREAK END; DROP TABLE #jobs; END;
這工作得很好。但我覺得更聰明和/或更安全(
WHILE 1 = 1
?)的解決方案應該是可能的。我對以下事情感到好奇,希望您能給我一些見解:
- 這種方法有什麼問題?
- 你能建議一個更好的方法來做到這一點嗎?
(我首先在StackOverflow上發布了這個問題,因為我專注於改程序式碼。仍然有效。但我的猜測是,這裡的人們通常會有更聰明的說法來說明為什麼我不應該嘗試以我的方式這樣做’我現在就做,或者提供好的替代方案。)
編輯(7 月 25 日)
顯然,我的腳本並沒有太多錯誤,因為指出它存在問題的答案數量很少 :-) 這種腳本的替代方法似乎是使用專為這些腳本設計的工具任務(如 SQL Sentry 事件管理器或…) - 或自己編寫這樣的工具。我們不會在我現在的公司購買這樣的工具,所以現在我會堅持使用腳本。
SQL Sentry有一個專門為此而建構的工具:連結作業並將它們安排在不同的工作流順序中。
幾年前,在我加入公司之前,我就開始使用 SQL Sentry 來做到這一點。我想要的是一種在生產備份完成後立即在我們的測試伺服器上開始恢復工作的方法。
我最初實現的只是備份作業開始時間和恢復開始時間之間的一個相當大的緩衝區。這並不是萬無一失的。由於備份時間不同,緩衝區經常給我們留下浪費的時間,即使它本來可以恢復也沒有開始。有時緩衝區還不夠。
我接下來實施的與您所擁有的類似 - 我在測試伺服器上編寫了一個作業,該作業在計劃備份後不久開始,並不斷輪詢以查看作業何時完成。後來修改為僅在更新測試伺服器上的表的備份作業中進行第二步。沒有太大的不同,除了恢復作業只需要在本地查看表,而不是遠端監控作業歷史記錄。回想一下,這可能是該表上的一個觸發器,
sp_start_job
因此該作業不必每 n 分鐘執行一次(或根本不需要安排)。最終的解決方案是將作業連結在一起……當伺服器 A 上的備份完成時,事件管理器會在伺服器 B 上啟動恢復作業。如果有第三個作業和第四個作業,或者基於要做什麼的條件邏輯當一項工作失敗與成功等時,這一切都可以解釋。工作流設計器會提醒你不少 SSIS:
當然,我所描述的基本機制不是火箭手術。如果您坐下來完成,您可以自己編寫這種類型的連結包裝器。只是為您提供一種您不需要的替代方案。