SQL Server代理(8/12):使用SQL Server代理外部程式

来源:http://www.cnblogs.com/woodytu/archive/2016/02/20/5194255.html
-Advertisement-
Play Games

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代理,還有深入談下作業的安全上下文。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.動態載入腳本 <script type="text/javascript"> function loadScript(url){ var script=document.createElement("script"); script.type="text/javascript"; script.
  • 代碼: 輸出結果 補充: reg.lastIndex:下一次正則捕獲的開始查找的索引位置 ->正則的懶惰性就是因為預設情況下lastIndex值都是0,我們不管執行幾次exec,都是從字元串的開始位置查找,那麼每一次捕獲到的都是第一個符合的內容
  • 今天看了關於js閉包方面的文章,還是有些雲里霧裡,對於一個菜鳥來說,學習閉包確實有一定的難度,不說別的,能夠在網上找到一篇優秀的是那樣的不易。 當然之所以閉包難理解,個人覺得是基礎知識掌握的不牢,因為閉包牽扯到一些前面的東西,比如作用域\等等,如果連基本的作用域都沒有弄清楚,自然不可能搞懂閉包,還有
  • [1]基本術語 [2]構造行框 [3]行內非替換元素 [4]行內替換元素
  • 這裡講的不會太多, 因為所有的語言都是一樣的, 一些基本的東西, 所以就隨便寫寫. 變數 變數就是可變的量, 編程角度理解就是用於存儲某種/某些數值的存儲器. 我們可以把變數具象理解為一個盒子, 而我們給的值就是盒子裡面的東西, 這個盒子在那裡不動, 而我們是可以改變盒子裡面的東西的. 變數的命名規
  • var BrowserMatch = { init: function () { this.browser = this.getBrowser().browser || "An Unknown Browser"; this.version = this.getBrowser().version ||
  • 之前寫過一篇博文,《不好的MySQL過程編寫習慣》(http://www.cnblogs.com/wingsless/p/5041838.html)。這篇博文里強調了不要迴圈的提交事務,儘量將可以放在一起的SQL同一個事務提交,會快很多很多。博文中提到了redo的問題,因此,結合最近編寫新員工培訓材
  • 最近一段時間在準備新員工培訓的材料,本來打算介紹介紹概念就OK的,但是既然寫了事務的章節,就特別想介紹一下鎖,介紹了鎖,就忍不住想介紹一下Next-Key Lock。 大家知道,標準的事務隔離級別有READ UNCOMMITTED,READ COMMITTED,REPEATED READ和SERIA
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...