我目前正在处理一项任务,我需要从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和其他一些事情中使用模拟。有什么建议?我错过了什么?
答案 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服务并克服遇到的安全问题。