SQL Server代理是所有實時資料庫的核心。代理有很多不明顯的用法,因此系統的知識,對於開發人員還是DBA都是有用的。這系列文章會通俗介紹它的很多用法。 如我們在這裡系列的前幾篇文章所見,SQL Server代理由一系列的作業步驟組成,每個步驟是將要進行的不同類型的工作。這個作業步驟的每個都是技
SQL Server代理是所有實時資料庫的核心。代理有很多不明顯的用法,因此系統的知識,對於開發人員還是DBA都是有用的。這系列文章會通俗介紹它的很多用法。
如我們在這裡系列的前幾篇文章所見,SQL Server代理由一系列的作業步驟組成,每個步驟是將要進行的不同類型的工作。這個作業步驟的每個都是技術獨立的,但你可以通過作業步驟作為不同的工作項目,來創建工作流。在這篇文章里,你會學到如何在作業步驟間使用工作流來修改要進行的操作,還有單個作業處理多個條件。你也會進一步檢查作業步驟安全的細節和不同作業子系統。
SQL Server代理作業步驟
SQL Server代理作業,如第2篇所描述的,包含一個或多個作業步驟。每個作業步驟是完全獨立的操作,對於錯誤控制,日誌和工作流都有獨自的邏輯。當作業包含不止一個步驟,通過單個作業的工作流會有新的理解問題。沒有包含作業步驟的作業本身不做任何事情(只有幾個小警告)。
SQL Server代理作業步驟流
為了檢查作業步驟和它們的工作流,在SSMS里創建新的作業。在SQL Server代理下右擊【作業】文件夾,選擇【新建作業】。在【常規】頁面,命名作業名為“作業步驟”。選擇【步驟】頁,然後點擊【新建】按鈕來創建第一個作業步驟。新建作業步驟對話框出現,如圖1所示。
插圖1:新建作業步驟對話框
給作業步驟命名為“步驟1”。 選擇類型,所謂的作業子系統(這裡我們保持預設,T-SQL )。輸入的簡單命令會在master資料庫,例如SELECT
*
FROM
sys.tables
。點擊【分析】按鈕驗證下你輸入的語句是否正確,會彈出如插圖2所示的對話框。如果你語句有錯誤,會彈出如插圖3所示的對話框。儘管這個錯誤看起來複雜,真正的錯誤在對話框的底部,語法錯誤。你可以點擊左下腳的第3個按鈕來或獲得額外的技術細節,但這個會給你SQL Server管理對象(SMO).net的錯誤診斷,對你的語法錯誤沒有太多的幫助。
插圖2:T-SQL成功分析
插圖3:T-SQL語句檢測到錯誤
一旦T-SQL分析成功,點擊對話框的【高級】頁,如插圖4所示。
插圖4:作業步驟對話框的【高級】頁。
作業步驟對話框的高級頁是SQL Server代理工作流發生的地方。當作業步驟成功時,你必須選擇應該發生的操作(“成功時要進行的操作”),同樣也有如果作業步驟失敗時要進行的操作。對於作業成功,你有三個選項:
- 轉到下一步:這是預設的行為。在這個作業步驟里一切正常的話,繼續下一步。如果這個作業是最後一步,退出作業報告步驟的累積結果(如果某個步驟失敗但工作流繼續,還是報告失敗)。
- 退出報告成功的作業:如果這一步成功,退出作業立即報告它成功完成。例如,如果作業是由SQL Server代理警報執行,修複可能需要多個作業步驟,如果前面的步驟完成,你可以選擇這個選項來退出並報告自動修複完成。
- 退出報告失敗的作業:如果因為某些原因你要退出作業並報告作業失敗(例如有一個錯誤的測試條件),你可以選擇這個選項。通常應該有類似的作業警報設置為任何必要的後續。
接下來,你可以選擇作業失敗後重試作業步驟(不報錯誤)。例如,如果你知道一些阻塞可能會導致你的作業步驟失敗,你可以指定步驟嘗試2次,一次一分鐘(重試次數:2,重試間隔(分鐘):1)。
失敗時要執行的操作,和上面所述的成功操作有同樣的選擇,但預設是退出報告失敗作業。
因為這個作業是T-SQL類型,你可以指定一個輸出文件存儲
查詢的結果。你可能還會勾選”將輸出追加到現有文件”,這樣你就不會失去以前的結果,但是你需要創建一個進程定期截斷文件,那樣它就不會消耗你所有的磁碟
空間。或者,你可以將查詢結果保存到資料庫的一個表中。第三個選項,在歷史記錄中包含步驟輸出,將存儲在
msdb.dbo.sysjobhistory(原文說保存在msdb.dbo.sysjobstepslogs,但查看數據表中沒記錄)。忽視“作為以
下用戶運行”選項,我們將會在後面看到。
單擊“確定”,你現在添加一個作業步驟。單擊“確定”,你現在有了一個作業。重新打開“Steps
Example”作業(即右鍵點擊作業菜單選擇屬性),瀏覽到作業步驟,點擊新建,添加第二個作業步驟。在這一步中,稱之為“步驟2”,作業類型選擇
“PowerShell”,然後輸入以下PowerShell腳本來看看伺服器操作系統屬性(插圖5)。
1 Set-Location SQLSERVER:\SQL\localhost\DEFAULT\Databases\msdb 2 Get-Item . | Get-Member -Type Properties
插圖5:添加一個PowerShell步驟到作業
這個作業步驟點擊高級頁面並選中“在歷史記錄中包含步驟輸出”,因此你可以看到PowerShell腳本運行和查看結果。單擊確定,然後再次單擊OK,你會看到插圖6。因為作業中步驟1在運行後,退出報告作業成功,那麼步驟2永遠不會運行。
插圖6:警告作業流步驟可能有問題
選擇【否】,導航到第一個作業步驟的高級頁面,更改"成功時要執行的操作"到“轉到下一步”。你可能已經註意到一些事情。第一,你沒有選擇"退出報告成功 的作業"選項-這是怎麼發生的呢?當你創建了第一個作業步驟,然後創建作業,只有一個單一的作業步驟,所以SSMS幫你退出並更改了成功的操作。當你在添 加第二步驟,你需要手動調整業務流。每次增加額外的步驟,都需要返回和編輯作業。
第二件讓你註意的事情是,在這個對話框你也可以直接導航到各個步驟(插圖7)。你不必轉到下一步。你可以想象一個有10步的作業,並根據你的作業步驟的結果,跳到一個不同的步驟。這樣你可以在作業中創建更複雜的工作流程。
插圖7:調整作業步驟1的工作流到下一個作業步驟
點擊【確定】,那麼在作業運行的時候,第二個步驟就會被執行了。
現在,運行作業(SSMS中右鍵單擊作業並選擇【開始作業步驟…】,然後單擊【開始】。一旦工作成功完成後,再次右鍵單擊作業選擇【查看歷史記錄】,你可以在歷史作業步驟中看到輸出結果(插圖8)。
插圖8:在SQL Server代理作業歷史記錄里查看作業步驟歷史
SQL Server代理作業安全
當你創建步驟的類型為PowerShell,你可能已經註意到,作業步驟的常規頁面的"運行身份"選項是可用的,“SQL Server代理服務帳戶”被選。當T-SQL作業連接到SQL Server,它作為SQL Server代理服務的一部分,並將用服務帳戶運行。當其他子系統的運行作業(如PowerShell、操作系統(CmdExec)、ActiveX)他 們實際上在Windowsw創建一個單獨的進程,然後連接到SQL Server或操作系統。這個過程需要有一個安全上下文運行在Windows,你可以在"運行身份"選項選擇安全上下文。在本系列文章的第十篇我們將檢查 代理帳戶,並詳述如何為作業步驟選擇不同的安全上下文。
你可能會問,T-SQL類型步驟的高級選項頁面下的"作為以下用戶運行"。如果一個SQL
Server代理作業的所有者是sysadmin伺服器角色的成員,那麼T-SQL作業步驟可以運行在不同的資料庫用戶的上下文,你可以在這裡選擇用戶。
如果作業的所有者不是sysadmin伺服器角色的成員,此選項將不可用,作業步驟在作業的所有者的安全上下文運行。此選項僅可用於T-SQL子系統,代
理帳戶必須用於其他作業子系統。
下篇預告
SQL Server代理作業步驟可以在單一的作業提供複雜的工作流。你可以轉到前面,或跳過作業步驟,或退出作業在成功/失敗時。每個作業步驟相對其他步驟是一種完全不同的作業項目,對作業步驟日誌結果有多種選擇。
現在,你可以創建有趣的作業然後運行,下一步將監視作業正在運行和已運行的歷史記錄。因此,我們下一篇將查看作業活動監視器。