SQL Server代理(8/12):使用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腳本作為微軟所有產品的標準腳本?;〞r間學習下PowerShell會讓你的SQL Server代理非常強大!
下篇預告
SQL Server代理的CmdExec,PowerShell和ActiveX子系統允許你與SQL Server代理進行很多任務,包括運行批處理文件或外部程序。另外,使用PowerShell你可以訪問和控制任何微軟產品。對于新的任務,推薦使用PowerShell子系統。
在下篇文章里,我們會談論下SQL Server代理安全。到目前為止,這系列文章都假定你是sysadmin服務組成員,下一步會從SQL Server代理的非sysadmin組成員角度談論下SQL Server代理,還有深入談下作業的安全上下文。
原文鏈接:http://www.sqlservercentral.com/articles/Stairway+Series/72459/
總結
以上是生活随笔為你收集整理的SQL Server代理(8/12):使用SQL Server代理外部程序的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Shell基础整理
- 下一篇: 如何解决秒杀的性能问题和超卖的讨论 及防