38

.Netアセンブリ(.Net 3.5)からSQL 2008でアセンブリを作成しようとすると、以下のエラーが発生します。エラーは、以下のプロパティのいずれかをtrueに設定する必要があることを示しています。どうすればよいですか?

データベース所有者(DBO)は、TRUEとしてEXTERNALACCESSASSEMBLY権限を持っています

データベースには、TRUSTWORTHYデータベースプロパティがあります

アセンブリは、EXTERNALACCESSASSEMBLY権限を持つ対応するログインを持つ証明書または非対称キーで署名されています。

完全なエラーは以下のとおりです。

アセンブリ'SQLLogger'がPERMISSION_SET=EXTERNAL_ACCESSに対して許可されていないため、アセンブリ'SQLLogger'のCREATEASSEMBLYが失敗しました。アセンブリは、次のいずれかに該当する場合に許可されます。データベース所有者(DBO)にEXTERNAL ACCESS ASSEMBLY権限があり、データベースにTRUSTWORTHYデータベースプロパティがあります。または、アセンブリが、EXTERNALACCESSASSEMBLY権限を持つ対応するログインを持つ証明書または非対称キーで署名されています。

前もって感謝します!

4

7 に答える 7

44

これは私のために働いた:

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
于 2014-06-30T10:37:36.377 に答える
33

⚠‼設定しないでくださいTRUSTWORTHY ON...⚠

...絶対に必要な場合を除いて‼そして、ビルドしていないアセンブリをロードする場合でも、「必要」になることはほとんどありません( SQL Serverにロードした後、いつでも別の証明書を追加できます。最悪の場合は署名できます)。または、「サポート」されていないためにSQL ServerのCLRホストにまだ存在しない.NETFrameworkライブラリをロードする場合(署名された証明書を使用できます。最悪の場合:SQL Serverにロードした後に署名します)。データベースを設定TRUSTWORTHY ONしてセキュリティホールを開くように設定します。詳細については、以下を参照してください。

お願いします、お願いします、なりすまし、信頼できる、およびクロスDB所有権チェーンの使用を停止してください

その代わり、

次のことを行う方がはるかに優れています。

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ファイルを使用する場合、上記の手順はSQLServerインスタンスごとに1回だけ実行する必要があります。アセンブリとそれらのアセンブリを含むデータベースの数は重要ではありません。または、証明書を使用して署名する場合は、上記のサンプルコードでに置き換えASYMMETRIC KEYてください。CERTIFICATE

このアプローチにより、データベースのセキュリティを向上させ(にTRUSTWORTHY設定したままにすることで)、どのアセンブリに設定したり、(署名やログインに基づいて異なるキーを使用して分離OFFできるため)を許可するかをより細かく制御できます。それらの異なるキーで)。EXTERNAL_ACCESSUNSAFE

ただし、このメソッドを使用する必要がある場合は、データベースの所有者がである必要はありません。要件は、データベース所有者として登録されたログインに、または(非対称キーベースのログインについて上記で示したのと同じ2つのアクセス許可)が付与されていることだけです。意味:TRUSTWORTHY ONsaEXTERNAL ACCESS ASSEMBLYUNSAFE ASSEMBLY

USE [master];
GRANT UNSAFE ASSEMBLY TO [{Login-that-is-dbo-for-DB-containing-Assembly}];

セキュリティオプションの詳細なウォークスルーについては、SQL Server Centralで作成した次の記事を参照してください。SQLCLRレベル4への階段:セキュリティ(EXTERNALおよびUNSAFEアセンブリ)


Visual Studio / SSDTを介してこれを自動化する方法の詳細なウォークスルーについては、SQL Server Centralに関する次の3つの記事(3部構成のシリーズ)を参照してください。

また、これら3つの記事を書いたので、T4テンプレートを使用するより簡単な方法を思いつきましたが、まだそれを書く時間がありませんでした。私がそうするとき、私はその記事へのリンクでこの答えを更新します。

アップデート

SQL Server 2017では、「CLRstrictsecurity」という名前のサーバーレベルの構成オプションの形式で新しい複雑さが導入されました。これはデフォルトで有効になっており、マークが付けられているアセンブリも含め、すべてのアセンブリにSAFE証明書または非対称キーで署名され、関連付けられたログインがあり、ログインにUNSAFE ASSEMBLYアクセス許可が付与されている必要があります(付与するには不十分EXTERNAL ACCESS ASSEMBLYです)。この新しい「機能」の詳細については、次のSOの質問に対する私の回答を参照してください。

SQLServer2017でのCLRの厳格なセキュリティ

于 2015-08-23T18:16:49.350 に答える
15

これらの設定はプロジェクトファイルで設定する必要があります。プロジェクトを右クリックしたら、プロジェクト構成から[データベース設定]をクリックして、[その他]タブを選択します。私がここに持っているものに似たものが表示されるはずです:プロジェクト設定

これは次と同じ質問です:CLRストアドプロシージャの実行エラー

于 2013-03-26T18:10:28.580 に答える
6

次のコードは、統合されたセキュリティのために私のために働きました:

ALTER DATABASE dtabasename SET TRUSTWORTHY ON;
GO

ALTER AUTHORIZATION ON DATABASE::dtabasename TO [DOMAIN\UserName]
GO
于 2014-10-20T12:38:16.527 に答える
5

これは次の場合に機能します。

  • Visual Studio 2015Update2。
  • VisualStudio2017。
  • VisualStudio2017およびSQLServer2019(@Ramkumar Sambandamに感謝)。

プロジェクト設定で、[外部アクセス]を選択します。

ここに画像の説明を入力してください

公開時に、アセンブリが「信頼できる」に設定されていない限り、「EXTERNAL_ACCESS」を受け入れることができないというエラーメッセージが表示されます。

したがって、プロジェクト設定で、アセンブリを「信頼できる」に設定します。

ここに画像の説明を入力してください

これは、ローカルハードドライブ上のファイルを一覧表示するサンプルのユーザー定義関数を実行できたことを意味します。

それでもセキュリティが制限されすぎる場合はDataAccess = DataAccessKind.Read、UDFに属性を追加します。例:

[Microsoft.SqlServer.Server.SqlFunction(FillRowMethodName = "FindFiles", DataAccess = DataAccessKind.Read, TableDefinition = "FileName nvarchar(500), FileSize bigint, CreationTime datetime")]

更新2017-07-02

+では、次のことも行う必要がありますSQL Server 2016Visual Studio 2015

  • use master;grant unsafe assembly to [Domain\Username];
  • プログラム(Visual StudioやC#ユーティリティなど)をモードで実行して、アセンブリAdministratorを公開するための十分なアクセス許可をプログラムに付与します。UNSAFE

sa何も機能しない場合は、ユーザー名と管理者パスワードを使用して接続してみてください。これは、Visual StudioがAdministratorモードで実行されているかどうかに関係なく、常に機能します。

アップデート2020-01-17

互換性のあるVS+SQLServerの組み合わせのリストを更新しました。

于 2016-04-02T21:36:53.383 に答える
3

これは私がそれを機能させることができた方法です:

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
于 2014-09-30T11:05:11.727 に答える
2

この一行で問題が解決します

use master;
grant external access assembly to [domain\username]
于 2013-10-03T08:08:10.553 に答える