SQL Server代理是所有實時資料庫的核心。代理有很多不明顯的用法,因此系統的知識,對於開發人員還是DBA都是有用的。這系列文章會通俗介紹它的很多用法。 在這個系列的上篇文章里,你學習如何使用SQL Server代理作業活動監視器監視作業活動和查看作業歷史。對於你的SQL Server代理作業進
SQL Server代理是所有實時資料庫的核心。代理有很多不明顯的用法,因此系統的知識,對於開發人員還是DBA都是有用的。這系列文章會通俗介紹它的很多用法。
在這個系列的上篇文章里,你學習如何使用SQL Server代理作業活動監視器監視作業活動和查看作業歷史。對於你的SQL Server代理作業進行實時監視和管理,作業活動管理器是個強大的工具。在這個系列的第8篇文章里,你會回顧SQL Server代理的另一個功能——運行操作系統命令行,在SQL Server外圍環境運行程式。一些程式是命令行(傳統的cmd應用程式/腳本或PowerShell腳本),或者甚至ActiveX腳本,但實際上你可以運行系統命令行,幾乎可以運行任何程式,只要程式不需要用戶的直接輸入。你會學到如何運行cmdexec和PowerShell腳本,我們會簡單討論下什麼時候用這些子系統會更合適。你學到如何從SQL Server代理調用其它程式。
內建作業子系統
如你在以前的文章所見,有很多內建的子系統。在這篇文章里,你會檢查可以在操作系統里運行腳本或程式的3個內建子系統,而不是在SQL Server環境本身的上下文。這3個包括:
- 操作系統(CmdExec)
- PowerShell
- ActiveX腳本
但一個程式或腳本從這個3個系統啟動時,在操作系統里會創建新的進程(例如不是SQL Server代理的一部分),腳本或程式運行,信息傳回啟動進程或腳本的SQL Server代理作業。
操作系統(CmdExec)子系統
第一個我們要談的是操作系統(CmdExec)子系統。CmdExec子系統打開一個命令行,猶如已經登錄到運行SQL Server的操作系統。從那點來說,你可以運行一切,在命令行里輸入。這包括任何的批處理文件,腳本,甚至你伺服器上存在的程式,當然你可以在輸入UNC路徑來訪問文件,這是CmdExec子系統可以做的。
但是安全呢?
當然,所有關於這個的重要提醒是許可權——會正常工作麽,在什麼安全上下文下?預設情況下,當你在CmdExec子系統里創建一個作業(或其他的,一會就會看到),作業會在SQL Server代理服務賬號的安全上下文運行(如插圖1所示)。你也會留意到這是個下拉的值,因此也有其它選項。在這個系列的第10篇,你會用到代理賬號。另一個要註意的重點:你必須是SQL Server的sysadmin組成員,才可以運行SQL Server代理服務賬號運行的作業。
插圖1:在CmdExec作業步驟里的作業安全
創建一個CmdExec作業步驟
為了創建CmdExec作業步驟,創建新的作業(我們命名為Shellout),然後添加新的作業步驟。如插圖1所示,我們命名步驟為S1,修改作業步驟類型為“操作系統(CmdExec)”,保持運行身份為預設(”SQL Server 代理服務賬號“)。對於我們的第一個作業,簡單的輸入”dir c:\",如插圖1所示命令文本。點擊【確定】,然後點擊【確定】保存作業。運行作業(右擊作業“Shellout”,選擇【作業開始步驟】),一旦作業完成運行,右擊選擇【查看歷史記錄】。點擊作業步驟的輸出,如插圖2所示,已經對應C盤執行了dir命令。
插圖2:日誌文件查看起顯示的CmdExec作業執行結果
如你所想象的,這個是一個簡單的命令,你很容易想到運行複雜的批處理腳本,或者如剛纔描述的,甚至啟動一個程式(例如,啟動“記事本”)。 提醒一句,如果你啟動例如記事本的程式,它會運行在虛擬隱藏的桌面,等待用戶輸入。因為桌面是隱藏的,沒有用戶可以輸入,甚至退出程式的命令也不行。換句話說,你的作業步驟永遠不會結束。你需要在例如任務管理器里找到記事本的進程,殺掉進行來讓作業步驟返回。從CmdExec子系統運行程式會有很多有趣的場景,只要程式會正常返回控制給SQL Server代理,才會結束。
PowerShell子系統
PowerShell自SQL Server 2008發佈的時候加入。它支持PowerShell 1.0 或 PowerSher 2.0,取決與你伺服器上安裝的版本。當你創建了一個作業步驟,選擇了PowerShell子系統作為你的作業步驟類型,你會有和CmdExec子系統類似的選項。你可以輸入PowerShell腳本的文本,或調用現存的PowerShell腳本。當你從SQL Serverdialing里啟動PowerShell會話,SQL Server的PowerShell會提前為你載入。
當使用PowerShell腳本簽名和安全時,有很多要考慮的事情,這個話題太大,在這裡就不討論了。但你可以參閱下它的用戶手冊:https://technet.microsoft.com/en-us/library/ee176949.aspx
順便提下,PowerShell會很容易成為你的腳本工具。對於SQL Server里常規操作,例如運行T-SQL會更簡單。
不管怎樣,重覆的工作,或者在CmdExec情況下的操作,從PowerShell子系統離開SQL Server環境的任何操作都更簡單。
為了展示一個例子,重新打開你的ShellOut作業,增加一個作業步驟S2。選擇PowerShell作為作業類型,例如下列腳本:
1 $server = new-object( 'Microsoft.SqlServer.Management.Smo.Server' ) “(local)” 2 3 foreach ($database in $server.databases) 4 { 5 $dbName = $database.Name 6 Write-Output "Database: $dbName" 7 }
插圖3:PowerShell子系統的作業步驟
這個腳本會直接登錄到你的本地SQL Server(如果要指定伺服器就修改實例名稱),然後在伺服器上迴圈獲得每個資料庫的名稱。你很容易會想到資料庫備份,例如檢查它們的屬性等。另外要註意的是你已經登錄並連接到資料庫——因此在你的組織里你可以登錄到任意的SQL Server。為了試驗這個,點擊確定,再次點擊確定。如果出現提示,修正作業步驟1這樣它會正確走向下一步。運行作業,和查看CmdExec子系統步驟的輸出一樣的方法。你會看到輸出有伺服器上的資料庫名稱列表。
PowerShell子系統真正有趣的是,你可以從操作系統、活動目錄查詢信息,然後可以運行你想要對你伺服器操作的任何腳本。你想查詢SQL Server監聽的埠號麽?你用通過PowerShell查詢WMI。你想從註冊表獲取信息?也是可以的。在網路上有很多PowerShell腳本,你可以自己依據需要搜索下。
ActiveX腳本子系統
ActiveX腳本子系統允許你運行運行ActiveX腳本,在操作系統里可以使用VBScript或Jscript。這裡包括這個子系統是作為補充,但你不應該從SQL Server代理使用ActiveX腳本。這個子系統已經剝離,就是說以後的SQL Server將會移除這個功能。
我應該使用哪個子系統?
如果現存的作業使用其中一個子系統,你應該繼續使用它,除非你有足夠的理由來修改它。不管怎樣,如果你啟動一個新的作業或作業步驟,PowerShell子系統提供你足夠強大的功能。另外,微軟已經將PowerShell腳本作為微軟所有產品的標準腳本。花時間學習下PowerShell會讓你的SQL Server代理非常強大!
下篇預告
SQL Server代理的CmdExec,PowerShell和ActiveX子系統允許你與SQL Server代理進行很多任務,包括運行批處理文件或外部程式。另外,使用PowerShell你可以訪問和控制任何微軟產品。對於新的任務,推薦使用PowerShell子系統。
在下篇文章里,我們會談論下SQL Server代理安全。到目前為止,這系列文章都假定你是sysadmin服務組成員,下一步會從SQL Server代理的非sysadmin組成員角度談論下SQL Server代理,還有深入談下作業的安全上下文。