2009-04-15 113 views
4

我目前正在從事一項任務,其中我需要從CLR存儲過程調用Web服務中的方法。SQL CLR存儲過程和Web服務

一點背景:

基本上,我有一個需要運算的ALOT任務。如果在SQL中嚴格執行,則需要大約30-45分鐘的時間來處理。如果我將相同的過程放入代碼中,由於能夠更高效地優化處理,我可以在幾秒鐘內完成它。唯一的問題是我必須將此過程設置爲SQL Server中的自動化任務。

就這一點而言,我已經將該流程公開爲Web服務(我也將其用於其他事情),並希望SQL CLR sproc使用該服務並執行代碼。這使我能夠完成自動化任務。

問題:

我已閱讀關於如何消耗在CLR存儲過程的網絡服務,並已經這樣做了用途不同相當多的不同的主題。這是我所遵循的一個例子。

http://blog.hoegaerden.be/2008/11/11/calling-a-web-service-from-sql-server-2005/

我能得到這個例子沒有任何問題的工作。但是,每當我將這個過程與一個涉及數據庫調用的Web服務方法配對時,我會得到以下例外(取決於是否包裝在try/catch中):

Msg 10312,Level 16,State 49,過程usp_CLRRunDirectSimulationAndWriteResults,行0 .NET Framework執行被中止。 UDP/UDF/UDT沒有恢復線程令牌。

消息6522,級別16,狀態1,過程MyStoredProc,行0

的用戶執行過程中發生

.NET框架誤差定義 例程或聚合MyStoredProc':

System.Security.SecurityException:請求獲得類型爲 的權限'System.Security.Permissions.EnvironmentPermission,mscorlib, Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934 e089' 失敗。

System.Security.SecurityException:

在System.Security.CodeAccessSecurityEngine.Check(對象的需求, StackCrawlMark & stackMark,布爾isPermSet)

在System.Security.CodeAccessPermission.Demand()

在System.Net.CredentialCache.get_DefaultCredentials()

在 System.Web.Services.Protocols.WebClientPr otocol.set_UseDefaultCredentials(布爾值 值)

at MyStoredProc.localhost.MPWebService。set_UseDefaultCredentials(布爾 值)

在MyStoredProclocalhost.MPWebService..ctor()

在MyStoredProc.StoredProcedures.MyStoredProc(字符串FromPostCode, 字符串ToPostCode)

我相信這是一個權限問題,但我不能,爲我的生活得到它的工作。我曾嘗試在CLR sproc和其他一些內容中使用模擬。有什麼建議麼?我錯過了什麼?

回答

2

我只是搞清楚了這一點,但是這是我的了:

您需要在創建SQL中的裝配不安全設置PERMISSION_SET。

CREATE ASSEMBLY [<assemblyname>] FROM '<path>/<assemblyname>.dll' 
WITH PERMISSION_SET = UNSAFE 
GO 

如果您使用的是VS SQL數據庫項目做您的部署,這也可以通過對數據庫項目的權限設置不安全的屬性的數據庫選項卡中完成。

-1

希望檢查blog entry這將幫助您從SQL存儲過程中調用Web服務並克服您遇到的安全問題。

+0

鏈接不工作,所以回答沒有有用的信息 – 2014-03-27 09:00:13

0

你應該檢查我blog post

這是土耳其,但你可以通過頁面上的谷歌工具翻譯。試想一下,Agent類中的方法將調用您的Web服務。在示例中使用System.Web依賴項而不是System.Management。