4

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

一点背景:

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

在这种情况下,我将流程公开为 Web 服务(我也将它用于其他事情)并希望 SQL CLR 存储过程使用该服务并执行代码。这让我可以完成我的自动化任务。

问题:

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

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

我可以让这个例子正常工作。但是,每当我将此进程与涉及数据库调用的 Web 服务方法配对时,我都会收到以下异常(取决于我是否包含在 try/catch 中):

消息 10312,级别 16,状态 49,过程 usp_CLRRunDirectSimulationAndWriteResults,第 0 行 .NET Framework 执行已中止。UDP/UDF/UDT 没有恢复线程令牌。

或者

消息 6522,级别 16,状态 1,过程 MyStoredProc,第 0 行

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

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,布尔 isPermSet)

在 System.Security.CodeAccessPermission.Demand()

在 System.Net.CredentialCache.get_DefaultCredentials()

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

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

在 MyStoredProclocalhost.MPWebService..ctor()

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

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

4

1 回答 1

2

我只是想出来,但这就是我得到的:

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

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

如果您使用 VS SQL 数据库项目进行部署,也可以通过在数据库项目的属性的数据库选项卡上将权限设置为不安全来完成。

于 2009-06-19T18:08:31.057 回答