我编写了一些 CLR 集成的用户定义函数,其中一个需要在绝对路径中调用 PInvoke 方法到 C++ dll。
[DllImport(@"C:\FullPath\CppCode.dll"...
我已将其部署在 SQL Server 2008 R2(无服务包)上,并且能够成功调用此 UDF 并接收查询结果。(我启用了 CLR,使用权限集 UNSAFE 加载了 CLR 程序集,并将 trustworthy 设置为 true。我还拥有机器和 SQL 服务器实例的完整管理员权限)
但是,当我在另一台安装了 SQL Server 2012 的机器上执行完全相同的操作时(操作系统和这台机器上的几乎所有配置都与另一台相同),我可以调用除 PInvoke 函数之外的所有 CLR 函数,它得到以下内容错误信息
Msg 6522, Level 16, State 1, Line 2
A .NET Framework error occurred during execution of user-defined routine or aggregate "MyUserDefinedFunction":
System.ArgumentException: System.Security.Policy.PolicyException Execution permission cannot be acquired.
at UserDefinedFunctions.MyMethodWithPInvoke()
...(more stack trace)
---> System.Security.Policy.PolicyException: Execution permission cannot be acquired.
System.Security.Policy.PolicyException:
... (more stack trace)
System.ArgumentException:
at UserDefinedFunctions.MyUserDefinedFunction( ...
我曾与我们的数据库人员一起工作,我们尝试向我们能想到的所有帐户授予管理员权限(甚至是 SQL Server 配置管理器中所有 SQL Server 服务的服务帐户),但我们正在努力弄清楚是什么SQL Server 2008 和 2012 之间进行了某种策略更改。
有谁知道需要做什么才能允许 SQL CLR 函数调用 PInvoke 到 SQL Server 2012 中磁盘上的 DLL?它在 2008 R2 中运行良好
编辑:我在 PInvoke 调用周围投入了一个 try/catch,并且能够发现 PolicyException 具有以下属性
Message: "Execution permission cannot be acquired."
Source: "mscorlib"