これらすべてのコマンドを実行するログインは、SQL 2012 Developerインスタンスのsysadmin
サーバーロールのメンバーです。これがデプロイされているDBの所有者です。 EXTERNAL ACCESS Assembly
このDBのログインに権限が付与されました。また、sa
ログインを使用しないで、以下のすべてを試してみました。
alter database test set trustworthy on
go
create Assembly [icsharpcode.sharpziplib]
from 'C:\Workspace\111\icsharpcode-SharpZipLib-4f2d664\bin\Release\ICSharpCode.SharpZipLib.dll'
with permission_set = UNSAFE --< This works!
go
create Assembly OutOfRowCompression
from 'C:\Workspace\Sandbox\OutOfRowCompression\OutOfRowCompression\bin\Debug\OutOfRowCompression.dll'
with permission_set = UNSAFE --< This fails!
go
最後のコマンドは失敗します:
メッセージ10327、レベル14、状態1、行1アセンブリ 'OutOfRowCompression'のアセンブリの作成は、アセンブリ 'OutOfRowCompression'がPERMISSION_SET = UNSAFEに対して承認されていないため失敗しました。アセンブリは、次のいずれかに該当する場合に承認されます。データベース所有者(DBO)にUNSAFEアセンブリ権限があり、データベースにTRUSTWORTHYデータベースプロパティがオンになっている。または、アセンブリは、UNSAFEアセンブリ権限を持つ対応するログインを持つ証明書または非対称キーで署名されています。
エラーが発生した後、新しい非対称キーでアセンブリに署名しましたkey1.pfx
をマスターDBに追加します。
CREATE ASYMMETRIC KEY key1
FROM executable
FILE = 'C:\Workspace\Sandbox\OutOfRowCompression\OutOfRowCompression\bin\Debug\OutOfRowCompression.dll'
キーが存在することを確認しました:
このキーからログインを作成し、神モードを許可しました:
create login clr_key1 from asymmetric key key1
go
GRANT EXTERNAL ACCESS Assembly TO clr_key1
go
アセンブリ作成コマンドからの同じエラー。
Visual Studio 2012でSAFEおよびUNSAFEにアクセスできるアセンブリOutOfRowCompression
の構築を試みました-違いはありません。
エラーメッセージに示されているすべての要件を満たしていると思います。うまくいくはずです。何が欠けていますか?
GRANT
ステートメントが正しくありません。アセンブリをEXTERNAL_ACCESS
に設定する機能のみを付与し、UNSAFE
には設定しません。 UNSAFE
はEXTERNAL_ACCESS
よりも制限が少ないため、UNSAFE Assembly
をログインに付与すると、暗黙的にEXTERNAL ACCESS Assembly
権限が含まれます。
使用する必要があります:
GRANT UNSAFE Assembly TO [clr_key1];
追伸インポートする2つのDLLを、UNSAFE
としてマークする必要がある理由を確認する必要があります。静的変数に値を格納することが原因である場合、2つのセッションがこのコードを同時に実行すると、予期しない結果になる可能性があります。