web-dev-qa-db-ja.com

CLRアセンブリを作成するとき、PERMISSION_SET = UNSAFEのアセンブリは許可されていません

これらすべてのコマンドを実行するログインは、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の構築を試みました-違いはありません。

エラーメッセージに示されているすべての要件を満たしていると思います。うまくいくはずです。何が欠けていますか?

4
ajeh

GRANTステートメントが正しくありません。アセンブリをEXTERNAL_ACCESSに設定する機能のみを付与し、UNSAFEには設定しません。 UNSAFEEXTERNAL_ACCESSよりも制限が少ないため、UNSAFE Assemblyをログインに付与すると、暗黙的にEXTERNAL ACCESS Assembly権限が含まれます。

使用する必要があります:

GRANT UNSAFE Assembly TO [clr_key1];

追伸インポートする2つのDLLを、UNSAFEとしてマークする必要がある理由を確認する必要があります。静的変数に値を格納することが原因である場合、2つのセッションがこのコードを同時に実行すると、予期しない結果になる可能性があります。

7
Solomon Rutzky