標籤:
SQL Server代理是所有即時資料庫的核心。代理有很多不明顯的用法,因此系統的知識,對於開發人員還是DBA都是有用的。這系列文章會通俗介紹它的很多用法。
在這個系列的上篇文章裡,你學習如何使用SQL Server代理作業活動監視器監視作業活動和查看作業曆史。對於你的SQL Server代理作業進行即時監視和管理,作業Active Manager是個強大的工具。在這個系列的第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 Agent服務帳號“)。對於我們的第一個作業,簡單的輸入”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.Name6 Write-Output "Database: $dbName" 7 }
插圖3:PowerShell子系統的作業步驟
這個指令碼會直接登入到你的本地SQL Server(如果要指定伺服器就修改執行個體名稱),然後在伺服器上迴圈獲得每個資料庫的名稱。你很容易會想到Database Backup,例如檢查它們的屬性等。另外要注意的是你已經登入並串連到資料庫——因此在你的組織裡你可以登入到任意的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代理,還有深入談下作業的安全上下文。
SQL Server代理(8/12):使用SQL Server代理外部程式