第八篇 SQL Server代理使用外部程式

來源:互聯網
上載者:User

標籤:

本篇文章是SQL Server代理系列的第八篇,詳細內容請參考原文

在這系列的前幾篇,學習了如何用SQL Server代理作業活動監視器監控作業活動和查看作業記錄。在即時監控和管理SQL Server代理作業上,作業活動監視器是一個很好的工具。第八篇,你會看到SQL Server代理的另一個功能——the ability to shell out to the operating system and run programs outside of the SQL Server environment。有些程式是命令列(無論是傳統的命令應用程式/指令碼或PowerShell指令碼),甚至ActiveX指令碼,但是你可以運行幾乎任何程式,只要程式不要求使用者直接輸入。你將學習如何運行CmdExec和PowerShell指令碼,我們會簡短討論每個子系統的適用情境。你將學會如何從SQL Server代理調用其他程式。
內建作業子系統
在前面的文章中我們看到,存在幾個內建的作業子系統。在這篇文章中,你將學習三個內建作業子系統,它們能夠在Windows伺服器範圍運行指令碼或程式,而不是在SQL Server環境。這三個子系統包括:
->作業系統(CmdExec)
->PowerShell
->ActiveX指令碼
當一個程式或指令碼從這三個子系統啟動,一個單獨的進程在Windows建立,當指令碼或程式運行時,資訊被傳回到SQL Server代理作業。
作業系統(CmdExec)子系統
我們討論的第一個子系統是作業系統(CmdExec)子系統。CmdExec子系統開啟命令提示字元,就如你已登入到運行有SQL Server的Windows電腦。從這一點你可以運行任何你可以自己在命令提示字元視窗鍵入的命令。這包括任何批次檔、指令碼、甚至存在於伺服器上的程式。
安全性如何
當然,這一切的大問題是許可權——在什麼樣的安全上下文?預設情況下,當你建立CmdExec子系統作業(或其他的),這個作業將在SQL Server代理服務帳戶的安全上下文運行(8.1所示)。你可能還注意到,運行身份下有一個下拉選項。你將在第十篇理解這些Proxy 帳戶。另一個重要提示:你必須是SQL Server伺服器角色下sysadmin角色中的成員,才能以SQL Server代理服務帳戶運行作業。


圖8.1 CmdExec作業步驟中的作業安全
建立一個CmdExec作業步驟
建立新作業(ShellOut),新增作業步驟,8.1所示。我們將步驟名設為s1,更改作業步驟類型為"作業系統(CmdExec)",運行身份預設(SQL Server代理服務帳戶)。在命令視窗鍵入"dir C:\",點擊確定,再確定儲存作業。運行作業,執行完成後查看記錄。點擊作業步驟查看DIR輸出結果(圖8.2)
圖8.2 CmdExec作業運行結果
你可以想象,這是一個平常的命令,但是你可以運行複雜的批處理指令碼,甚至啟動程式(例如,"start notepad"將運行記事本)。值得注意的是,如果你運行一個程式,如記事本,它將在一個虛擬隱藏案頭運行,等待使用者輸入。因為案頭是隱藏的,使用者不可以提供任何輸入,即使退出程式的命令。換句話說,你的作業步驟不會完成/結束(測試作業完成後,記事本還開啟著)。你可以在工作管理員下找到記事本進程,然後kill掉進程。從CmdExec子系統運行程式有許多有趣的情境,只要程式完成時能自動返回控制到SQL Server代理。
PowerShell子系統
PowerShell的子系統隨著SQL Server 2008發布被添加到資料庫中。它有PowerShell 1.0或PowerShell 2.0版本,取決你伺服器上安裝的是哪個版本。當你建立一個作業步驟,選擇你的步驟類型為PowerShell子系統,你會有類似於CmdExec子系統的選項。你可以輸入一段PowerShell指令碼,或調用一個現有的PowerShell指令碼(.ps1)。當你使用SQL Server代理開始一個PowerShell會話,PowerShell provider和cmdlet會預先載入。
有許多與PowerShell指令碼簽名和安全處理需要考慮的,對本篇文章來說太廣泛。然而,你可以在Windows PowerShell Owner‘s Manual上讀到這些技術開發文章。
儘管如此,PowerShell很可能會成為你最喜歡的指令碼子系統。對於SQL Server中的普通任務,運行SQL指令碼通常是簡單的。然而,重複的任務,使用PowerShell的子系統就簡單多了。
舉例說明,重新開啟你的ShellOut作業,並添加一個作業步驟s2。類型選擇PowerShell,然後輸入下面的指令碼(圖8.3)

$server = new-object( ‘Microsoft.SqlServer.Management.Smo.Server‘ ) “(local)”foreach ($database in $server.databases) {$dbName = $database.NameWrite-Output "Database: $dbName" }


圖8.3 PowerShell子系統作業
這個指令碼將登入到你本地SQL Server(如果使用具名執行個體更改執行個體名稱),然後通過迴圈得到各資料庫的名稱。你可以想象備份資料庫,或檢查其屬性。要注意的另一件事是你必須登入並建立資料庫連接。點擊確定,再確定。調整步驟s1的工作流程,讓步驟s2正確運行。運行作業,並查看輸出結果。你會看到伺服器上的資料庫列表已輸出。
什麼是PowerShell子系統真正有趣的,你可以從作業系統、或Active Directory查詢資訊,然後運行任何你的伺服器支援的指令碼。你要查詢SQL Server監聽連接埠?你可以使用WMI通過PowerShell。你想從註冊表擷取一些資訊?在網上有很多PowerShell指令碼(包括許多文章在SQLServerCentral)。
ActiveX指令碼子系統
ActiveX指令碼子系統允許你運行ActiveX指令碼,可以使用VBScript或JScript在作業系統來完成任務。為了完整性,該子系統包含在,但是不建議在SQL Server代理使用ActiveX指令碼。該子系統是過時的,這意味著它將在未來版本的資料庫上刪除。
選擇哪個子系統?
如果你有一個現有的作業使用這些子系統,你應該繼續保持除非你有一個令人信服的理由去改變它。然而,如果你建立一個新的作業或作業步驟,PowerShell子系統提供了最令人信服的能力。此外,微軟顯然已經轉移到PowerShell方向作為所有微軟伺服器產品的標準指令碼語言。值得你投資時間去學習PowerShell。
下一篇
SQL Server代理的CmdExec、PowerShell、ActiveX子系統允許你的資料庫執行許多任務,包括運行批次檔或外部程式。此外,使用PowerShell可以訪問和控制幾乎任何微軟產品。新作業/作業步驟推薦使用PowerShell子系統。
在下一篇,我們將開始關注SQL Server代理安全。直到現在,這個系列已經假定你是sysadmin伺服器角色的成員。下一步將在SQL Server代理中使用非系統管理員,同時學習更多的作業安全上下文。

第八篇 SQL Server代理使用外部程式

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.