私はいくつかの CLR 統合ユーザー定義関数を作成しました。そのうちの 1 つは、絶対パスで C++ dll に対して PInvoke メソッドを呼び出す必要があります。
[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"