.NETアセンブリ(.Net 3.5)からSQL 2008でアセンブリを作成しようとすると、以下のエラーが表示されます。エラーは、以下のプロパティのいずれかをtrueに設定する必要があることを示しています。
データベース所有者(DBO)に外部アクセスアセンブリ権限がTRUEである
データベースには、TRUSTWORTHYデータベースプロパティがあります
アセンブリは、外部アクセスアセンブリのアクセス許可を持つ、対応するログインを持つ証明書または非対称キーで署名されます。
完全なエラーは以下のとおりです。
アセンブリ 'SQLLogger'はPERMISSION_SET = EXTERNAL_ACCESSに対して許可されていないため、アセンブリ 'SQLLogger'のCREATEアセンブリは失敗しました。次のいずれかに該当する場合、アセンブリは承認されます。データベース所有者(DBO)に外部アクセスアセンブリ権限があり、データベースのTRUSTWORTHYデータベースプロパティがオンになっている。または、外部アクセスアセンブリのアクセス許可を持つ対応するログインを持つ証明書または非対称キーでアセンブリが署名されます。
前もって感謝します!
これらの設定はプロジェクトファイルで設定する必要があります!プロジェクトを右クリックして、プロジェクト構成から[データベース設定]をクリックし、[その他]タブを選択します。私がここに持っているものに類似した何かを見るはずです:
これは次の質問と同じです: Error Running CLR Stored Proc
これは私のために働いた:
EXEC sp_changedbowner 'sa'
ALTER DATABASE [dbase] SET trustworthy ON
私もこれをやった:
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO
sp_configure 'show advanced options', 0;
GO
RECONFIGURE;
GO
どうしても必要な場合を除いて、TRUSTWORTHY ON
を設定notしてください!そして、ビルドせずに再署名できないアセンブリを読み込むときにのみ「必要」になります。また、「サポート」されていないためにSQL ServerのCLRホストにまだ含まれていない.NET Frameworkライブラリをロードする場合にほとんど発生します。これらの状況以外では、データベースをTRUSTWORTHY ON
に設定しないでください。セキュリティホールが開くからです。
代わりに、次のことを行うことをお勧めします。
USE [master];
CREATE ASYMMETRIC KEY [SomeKey]
AUTHORIZATION [dbo]
FROM EXECUTABLE FILE = 'C:\path\to\Some.dll';
CREATE LOGIN [SomeLogin]
FROM ASYMMETRIC KEY [SomeKey];
GRANT EXTERNAL ACCESS Assembly TO [SomeLogin]; -- or "UNSAFE" instead of "EXTERNAL ACCESS"
上記は、インスタンスごと、キーごとに1回だけ実行する必要があります。したがって、すべてのアセンブリに同じsnk
/pfx
ファイルを使用する場合、上記の手順はSQL Serverインスタンスごとに1回だけ実行する必要があります。アセンブリとそれらのアセンブリを含むデータベースの数は関係ありません。
このアプローチにより、(TRUSTWORTHY
をOFF
に設定したままにして)データベースのセキュリティを維持し、EXTERNAL_ACCESS
および/またはUNSAFE
に設定できるアセンブリをさらにきめ細かく制御できます(異なるキーを使用して分離できるため)これらの異なるキーに基づく署名とログイン)。
ただし、mustがTRUSTWORTHY ON
メソッドを使用する必要がある場合、データベース所有者はsa
である必要はありません。要件は、データベース所有者として登録されたログインにEXTERNAL ACCESS Assembly
またはUNSAFE Assembly
のいずれかが付与されていることだけです(上記の非対称キーベースのログインの2つの権限)。
セキュリティオプションの詳細なウォークスルーについては、SQL Server Centralで書いた次の記事を参照してください。 SQLCLRレベル4への階段:セキュリティ(EXTERNALおよびUNSAFEアセンブリ) (無料登録が必要です)。
Visual Studio/SSDTを使用してこれを自動化する方法の詳細なウォークスルーについては、SQL Server Centralの次の3つの記事(3部構成シリーズ)を参照してください。
また、これらの3つの記事を書いて以来、T4テンプレートを使用してより簡単な方法を考え出しましたが、まだそれを書く時間がありませんでした。その場合、この回答をその記事へのリンクで更新します。
SQL Server 2017では、「CLR strict security」という名前のサーバーレベルの構成オプションという形で新しい複雑さが導入されました。これはデフォルトで有効になっており、SAFE
としてマークされたものであっても、すべてのアセンブリに証明書または非対称キーで署名され、関連付けられたログインおよびにログインにUNSAFE Assembly
パーミッションが付与されている必要があります(EXTERNAL ACCESS Assembly
を付与するには不十分です)。次のSOへの私の答えをご覧ください。この新しい「機能」の詳細についての質問:
次のコードは統合セキュリティのために私のために働いた:
ALTER DATABASE dtabasename SET TRUSTWORTHY ON;
GO
ALTER AUTHORIZATION ON DATABASE::dtabasename TO [DOMAIN\UserName]
GO
これは私がそれをうまく機能させる方法です:
ALTER DATABASE databasename SET trustworthy ON
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO
sp_configure 'show advanced options', 0;
GO
RECONFIGURE;
GO
/
DROP Assembly assemblyname
GO
CREATE Assembly assemblyname
FROM 0x4D5A9000.....
WITH PERMISSION_SET = EXTERNAL_ACCESS
これは以下に対して機能します:
プロジェクト設定で、「外部アクセス」を選択します。
公開時に、アセンブリが「信頼できる」に設定されていない限り、「EXTERNAL_ACCESS」を受け入れることができないというエラーメッセージが表示されます。
そのため、プロジェクト設定で、アセンブリを「信頼できる」に設定します。
これは、 ローカルハードドライブ上のファイルをリストするユーザー定義関数のサンプル を実行できたことを意味します。
それでもセキュリティが厳しすぎる場合は、属性DataAccess = DataAccessKind.Read
UDFに、たとえば:
[Microsoft.SqlServer.Server.SqlFunction(FillRowMethodName = "FindFiles", DataAccess = DataAccessKind.Read, TableDefinition = "FileName nvarchar(500), FileSize bigint, CreationTime datetime")]
SQL Server 2016
+ Visual Studio 2015
、次のことも必要になる場合があります。
use master;grant unsafe Assembly to [Domain\Username];
Administrator
モードでプログラム(Visual StudioやC#ユーティリティなど)を実行して、UNSAFE
アセンブリを公開するための十分なアクセス許可を与えます。うまくいかない場合は、ユーザー名sa
と管理者パスワードを使用して接続してみてください。 Visual StudioがAdministrator
モードで実行されているかどうかに関係なく、これは常に機能します。
この単一の行は私のために問題を解決します
use master;
grant external access Assembly to [domain\username]