SQL CLR存储过程和Web服务

时间:2009-04-15 12:34:37

标签: sql web-services permissions clrstoredprocedure

我目前正在处理一项任务,我需要从CLR存储过程调用Web服务中的方法。

一些背景知识:

基本上,我的任务需要大量的运算。如果在SQL中严格完成,则需要大约30-45分钟才能处理。如果我将相同的过程拉入代码,我可以在几秒钟内完成它,因为能够更有效地优化处理。唯一的问题是我必须将此进程设置为SQL Server中的自动化任务。

在这种情况下,我将该过程公开为Web服务(我也将其用于其他事情)并希望SQL CLR sproc使用该服务并执行代码。这允许我完成自动化任务。

问题:

我已经阅读了很多关于如何在CLR Sproc中使用Web服务的不同主题,并且已经有效地完成了。这是我所遵循的一个例子。

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

我可以让这个例子没有任何问题。但是,每当我使用涉及数据库调用的Web Service方法对此进程进行配对时,我会得到以下异常(取决于我是否包装在try / catch中):

Msg 10312,Level 16,State 49,Procedure usp_CLRRunDirectSimulationAndWriteResults,Line 0 .NET Framework执行已中止。 UDP / UDF / UDT没有恢复线程令牌。

  

Msg 6522,Level 16,State 1,Procedure MyStoredProc,Line 0

     

执行用户定义期间发生.NET Framework错误   例行或聚合'MyStoredProc':

     

System.Security.SecurityException:请求类型的权限   'System.Security.Permissions.EnvironmentPermission,mscorlib,   Version = 2.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'   失败。

     

System.Security.SecurityException:

     

在System.Security.CodeAccessSecurityEngine.Check(对象需求,   StackCrawlMark&安培; stackMark,Boolean isPermSet)

     

在System.Security.CodeAccessPermission.Demand()

     

在System.Net.CredentialCache.get_DefaultCredentials()

     

在   System.Web.Services.Protocols.WebClientProtocol.set_UseDefaultCredentials(布尔   值)

     

在   MyStoredProc.localhost.MPWebService.set_UseDefaultCredentials(布尔   值)

     

at MyStoredProclocalhost.MPWebService..ctor()

     

at MyStoredProc.StoredProcedures.MyStoredProc(String FromPostCode,   String ToPostCode)

我确信这是一个许可问题,但我不能,因为我的生活让它发挥作用。我曾尝试在CLR sproc和其他一些事情中使用模拟。有什么建议?我错过了什么?

3 个答案:

答案 0 :(得分:2)

我只是搞清楚这一点,但这就是我得到的:

在SQL中为UNSAFE创建程序集时,需要设置permission_set。

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

如果您使用VS SQL数据库项目进行部署,也可以通过在数据库项目的“属性”的“数据库”选项卡上设置“权限”来实现。

答案 1 :(得分:0)

您应该查看我的blog post

这是土耳其语,但您可以在页面上使用Google工具进行翻译。试想一下Agent类中的方法将调用您的Web服务。并使用您的System.Web依赖项而不是示例中的System.Management。

答案 2 :(得分:-1)

希望检查这个blog entry,它将帮助您从SQL存储过程调用Web服务并克服遇到的安全问题。