これは2日間私を悩ませています。EXTERNAL_ACCESS を必要とする CLR sp があります。TRUSTWORTHY ON を設定することで、VS2010 経由で開発ボックスにデプロイできますが、運用サーバーにはそれを実行したくありません。AuthentiCode と互換性のある証明書を購入し、それを使用してアセンブリに署名しようとしましたが、チェーンが原因で失敗したため、ここで説明されている手順に従って証明書からチェーンを削除しました。
次に、VS でアセンブリに署名しようとしましたが、「存在しないトークンを参照しようとしました」というエラーが表示されました。
コマンドラインに移動し、いくつかのブロガーが推奨しているように、SignTool.exe を使用してチェーン解除された証明書でアセンブリに署名しました。ユーティリティは、署名が成功したことを報告します。
次に、開発ボックスの SQL Server (express 2008R2) にアセンブリをインポートします。この手順は運用サーバーに適用する必要があるため、最初に TRUSTWORTHY をオフに設定します。それから私は走ります
CREATE ASSEMBLY SqlClrProcedures from 'c:\<snip>\SqlClrProcedures.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS
これにより、次のエラーが発生します: *アセンブリ 'SqlClrProcedures' の CREATE ASSEMBLY が失敗しました。アセンブリは、次のいずれかに該当する場合に承認されます。データベース所有者 (DBO) に EXTERNAL ACCESS ASSEMBLY 権限があり、データベースに TRUSTWORTHY データベース プロパティがオンになっている。または、アセンブリは、EXTERNAL ACCESS ASSEMBLY アクセス許可を持つ対応するログインを持つ証明書または非対称キーで署名されています。
saでログインしました。ユーザーを作成し、データベースの所有権を割り当て、外部アクセスを許可します。
GRANT EXTERNAL ACCESS Assembly to ClrLogin
それから試してください
CREATE ASSEMBLY SqlClrProcedures AUTHORIZATION ClrLogin from 'c:\<snip>\SqlClrProcedures.dll'
WITH PERMISSION_SET = EXTERNAL_ACCESS
上記と同じエラーが発生します。
dbo には EXTERNAL ACCESS ASSEMBLY が付与されており、アセンブリは署名されていますが、対応するログインに関する部分がわかりません。証明書にログインする必要がありますか?
CREATE ASSEMBLY を通過するためだけに TRUSTWORTHY ON を設定すると、アセンブリは正常にインポートされますが、sp を実行すると次のエラーが発生します。
An error occurred in the Microsoft .NET Framework while trying to load assembly id 65573. The server may be running out of resources, or the assembly may not be trusted with PERMISSION_SET = EXTERNAL_ACCESS or UNSAFE. Run the query again, or check documentation to see how to solve the assembly trust issues. For more information about this error:
System.IO.FileLoadException: Could not load file or assembly 'sqlclrprocedures, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. An error relating to security occurred. (Exception from HRESULT: 0x8013150A)
System.IO.FileLoadException:
at System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection)
at System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection)
at System.Reflection.Assembly.Load(String assemblyString)
そのため、証明書が認識されていないようです。誰かが私が間違っていることを教えてもらえますか?