【发布时间】:2014-07-30 14:18:35
【问题描述】:
我写了几个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 Server 2012 中允许 SQL CLR 函数调用 PInvoke 到磁盘上的 DLL 需要做什么?它在 2008 R2 中运行良好
编辑:
我在 PInvoke 调用周围投入了一个 try/catch 并能够发现 PolicyException 具有以下属性
Message: "Execution permission cannot be acquired."
Source: "mscorlib"
【问题讨论】:
标签: sql permissions sql-server-2012 pinvoke clrstoredprocedure