2009-04-15 111 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。