2009-07-22 51 views

回答

4

我會小心xp_cmdshell,因爲它可以創造一個安全漏洞。看看這篇文章從 http://www.databasejournal.com/features/mssql/article.php/3372131/Using-xpcmdshell.htm

如果服務帳戶具有本地管理權限,那麼你可以使用此過程來執行任何Windows操作系統命令。

看看我以前問的這個類似的問題。經過一番研究後,我決定安全風險對於生產數據庫服務器來說太大了。你的情況可能不同,xp_cmdshell可能是答案。 SQL Server xp_cmdshell

1

運行的進程從一個觸發器是一個可疑的實踐啓動程序。您的交易將阻止,直到過程啓動並結束。另外,該進程被保證不能安全地讀取它導致它被啓動的記錄,因爲它被鎖定在等待進程終止的事務中。

執行此操作的正確方法是檢測觸發器中的條件,排隊通知並讓提交後的讀取器將通知出列並啓動進程。所有這些都可以在Transact-SQL中完成。

更新

BTW,當我說「是所有在Transact-SQL可行」我指的是服務代理和activation:觸發SEND SA消息的本地服務,也許是描述的關鍵項目更新與條件相符,在提交消息激活過程後,激活的過程讀取消息並啓動xp_cmdshell以使用適當的參數運行該工具。激活的程序has the rights to run xp_cmdshell because is properly signed。該工具在更新後的毫秒級內運行,但是從完全安全的上下文中進行更新/插入/刪除。

+0

這也假定您希望執行的任務應該從SQL/Broker機器運行。如果任務需要外部網絡權限等,一個適當隔離的SQL環境不會讓它「脫身」。 – devstuff 2009-07-22 05:56:16

+0

可以通過憑證以安全的方式細粒度地控制外部訪問,並且可以通過代碼簽名來控制憑證的使用。不是爲了心臟,而是可以實現的。 – 2009-07-22 06:06:08

3

xp_cmdshell是一個安全問題,同時也是一個設計問題(使得SQL Server運行其他應用程序並不是一個真正令人開心的情況,即使它可以被迫這樣做)。請,請不要採取觸發器建議 - 這是最糟糕的主意。我首先要做的是爲要運行的程序修改或創建一個包裝器,以便輪詢數據庫以查找符合條件的行,然後使用它們。如有必要,請在數據庫中創建一個表作爲要處理的行的隊列,或者在列中指示進程完成的行。