2015-04-24 23 views
0

我正在使用SQL Server中的觸發器或存儲過程來處理需要執行C#方法/函數(編碼在網頁上)的項目。從SQL Server中的觸發器執行C#方法/函數

我發現這個Execute-NET-Code-under-SQL-Server

但這個環節上所述,我必須將數據庫屬性TRUSTWORTHY更改爲ON

有沒有什麼辦法可以做到這一點,而無需更改數據庫屬性?

在此先感謝

+3

幾乎肯定不是。 –

+0

你絕對*不*必須改變這個數據庫屬性。只有當你的程序集沒有簽名並需要訪問外部資源時才需要它 –

+1

@PanagiotisKanavos由於OP需要以某種方式調用外部網頁(如果我正確得到了他的觀點),他需要使用TRUSTWORTHY ON和具有EXTERNAL_ACCESS權限的程序集。唯一的選擇 - 就是運行外部程序,正如我在回答中所述。 –

回答

1

好吧,如果你不希望(或不能)不使用SQLCLR - 你可以創建一個包含所有你需要的C#代碼一些獨立的控制檯應用程序,然後執行使用xp_cmdshell一些參數此應用程序。

但請注意:xp_cmdshell的默認情況下禁用,你必須使用

EXEC sp_configure 'xp_cmdshell', 1 

由於xp_cmdshell的是服務器選項來啓用它 - 你不需要改變數據庫的屬性,但是你必須改變服務器選項在禁用的情況下啓用它。選擇你自己 - 改變什麼。 ;)

+1

從安全的角度來看,這比改變數據庫選項差得多 - 「xp_cmdshell」可以使用SQL Server的服務帳戶輕鬆執行惡意腳本 –

0

您是否需要同步執行外部代碼?換句話說,在觸發器結束之前,外部代碼是否必須啓動並運行完成?

如果答案是肯定的,那麼我建議改變你的設計。您正在使用觸發器,並且使DML操作觸發極其緩慢的觸發器。

假設答案是否定的,您可以選擇將任何需要完成的工作排隊,並使該工作異步執行。例如,您的觸發器可以在需要此外部代碼運行時在工作隊列表中創建記錄。某些其他進程(例如,計劃任務,SQL代理,應用程序中的某些內容,SQL Server代理)可以監視此表以查找新記錄並根據需要啓動相應的調用。