アセンブリの作成

ストアド プロシージャやトリガーなどのマネージド データベース オブジェクトは、コンパイルされた後、アセンブリと呼ばれる単位で配置されます。 マネージド DLL アセンブリは、アセンブリが提供する機能を使用する前に、SQL Serverに登録する必要があります。 SQL Server データベースにアセンブリを登録するには、CREATE ASSEMBLY ステートメントを使用します。 ここでは、CREATE ASSEMBLY ステートメントを使用してアセンブリをデータベースに登録する方法と、アセンブリのセキュリティ設定を指定する方法について説明します。

CREATE ASSEMBLY ステートメント

データベースにアセンブリを作成するには、CREATE ASSEMBLY ステートメントを使用します。 たとえば次のようになります。

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll';  

FROM 句では、作成するアセンブリのパス名を指定します。 このパスには、UNC (汎用名前付け規則) パスか、コンピューターにローカルの物理ファイル パスを指定できます。

SQL Server は、名前、カルチャ、および公開キーが同じでありバージョンが異なるアセンブリの登録を許可していません。

他のアセンブリを参照するアセンブリを作成することもできます。 SQL Serverでアセンブリが作成されると、参照先アセンブリがまだデータベースに作成されていない場合は、ルート レベルアセンブリによって参照されるアセンブリも作成されます。

データベース ユーザーまたはユーザー ロールには、データベースにアセンブリを作成して所有する権限が与えられます。 アセンブリを作成するには、データベース ユーザーまたはロールに CREATE ASSEMBLY 権限が許可されている必要があります。

アセンブリから他のアセンブリを参照できる条件を次に示します。

  • 呼び出し先または参照先のアセンブリが同じユーザーまたはロールによって所有されている。

  • 呼び出し先または参照先のアセンブリが同じデータベースに作成されている。

アセンブリ作成時のセキュリティの指定

SQL Server データベースにアセンブリを作成する場合は、コードを実行SAFEできる 3 つの異なるセキュリティ レベル (、EXTERNAL_ACCESS、または UNSAFE) のいずれかを指定できます。 CREATE ASSEMBLY ステートメントを実行する際には、アセンブリによる登録を失敗させる可能性があるコード アセンブリに対し、特定のチェックがサーバー上で実行されます。 詳細については、 CodePlex の偽装サンプルを参照してください。

SAFE は、ほとんどのシナリオに使用できる既定の権限セットです。 特定のセキュリティ レベルを指定するには、CREATE ASSEMBLY ステートメントの構文を次のように変更します。

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll'  
WITH PERMISSION_SET = SAFE;  

上記のコードの 3 行目を省略しても、SAFE 権限セットを持つアセンブリを作成できます。

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll';  

SAFE 権限セットで実行されるアセンブリ内のコードでは、インプロセス マネージド プロバイダーを経由して、計算とサーバーのデータへのアクセスのみを実行できます。

EXTERNAL_ACCESS および UNSAFE アセンブリの作成

EXTERNAL_ACCESS は、ファイル、ネットワーク、レジストリ、環境変数など、サーバー外部のリソースにコードからアクセスする必要がある場合に使用します。 サーバーから外部リソースにアクセスする場合、常にマネージド コードの呼び出し元のユーザーのセキュリティ コンテキストが借用されます。

UNSAFE コードのアクセス許可は、アセンブリが検証可能に安全ではない、または Microsoft Win32 API などの制限付きリソースへの追加アクセスを必要とする状況を対象としています。

SQL Serverで アセンブリまたは UNSAFE アセンブリをEXTERNAL_ACCESS作成するには、次の 2 つの条件のいずれかを満たす必要があります。

  1. アセンブリが、厳密な名前で署名されているか、または証明書を使用して Authenticode で署名されている。 この厳密な名前 (または証明書) は、非対称キー (または証明書) としてSQL Server内に作成され、アクセス許可 (外部アクセス アセンブリの場合) またはUNSAFE ASSEMBLYアクセス許可 (安全でないアセンブリの場合) を持つEXTERNAL ACCESS ASSEMBLY対応するログインを持ちます。

  2. データベース所有者 (DBO) には EXTERNAL ACCESS ASSEMBLY (アセンブリの場合 EXTERNAL ACCESS ) または UNSAFE ASSEMBLY (アセンブリの場合 UNSAFE ) アクセス許可があり、データベースには TRUSTWORTHY データベース プロパティ が に ON設定されています。

上に示した 2 つの条件は、アセンブリの読み込み時 (実行も含む) にもチェックされます。 アセンブリを読み込むには、これらの条件の少なくとも 1 つが満たされている必要があります。

サーバー プロセスで共通言語ランタイム (CLR) コードを実行する場合にのみ、データベースの TRUSTWORTHY データベース プロパティ を に ON 設定しないことをお勧めします。 代わりに、master データベースのアセンブリ ファイルから非対称キーを作成してください。 その場合、この非対称キーにマップされるログインを作成する必要があります。また、このログインには、EXTERNAL ACCESS ASSEMBLY または UNSAFE ASSEMBLY 権限を与える必要があります。

CREATE ASSEMBLY ステートメントを実行する前の次の Transact-SQL ステートメント。

USE master;   
GO    
  
CREATE ASYMMETRIC KEY SQLCLRTestKey FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll'     
CREATE LOGIN SQLCLRTestLogin FROM ASYMMETRIC KEY SQLCLRTestKey     
GRANT EXTERNAL ACCESS ASSEMBLY TO SQLCLRTestLogin;   
GO   

Note

非対称キーに関連付ける新しいログインを作成する必要があります。 このログインは、権限を許可するためにのみ使用します。このログインをユーザーに関連付けたり、アプリケーション内で使用したりする必要はありません。

EXTERNAL ACCESS アセンブリを作成するには、作成者に EXTERNAL ACCESS 権限が許可されている必要があります。 この権限は、アセンブリの作成時に次のように指定します。

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll'  
WITH PERMISSION_SET = EXTERNAL_ACCESS;  

CREATE ASSEMBLY ステートメントを実行する前の次の Transact-SQL ステートメント。

USE master;   
GO    
  
CREATE ASYMMETRIC KEY SQLCLRTestKey FROM EXECUTABLE FILE = 'C:\MyDBApp\SQLCLRTest.dll';     
CREATE LOGIN SQLCLRTestLogin FROM ASYMMETRIC KEY SQLCLRTestKey ;    
GRANT UNSAFE ASSEMBLY TO SQLCLRTestLogin ;  
GO  

アセンブリを UNSAFE 権限で読み込むには、そのアセンブリをサーバーに読み込むときに、次のように UNSAFE 権限セットを指定します。

CREATE ASSEMBLY SQLCLRTest  
FROM 'C:\MyDBApp\SQLCLRTest.dll'  
WITH PERMISSION_SET = UNSAFE;  

各設定のアクセス許可の詳細については、「 CLR 統合セキュリティ」を参照してください。

参照

CLR 統合アセンブリの管理
アセンブリの変更
アセンブリの削除
CLR 統合のコード アクセス セキュリティ
TRUSTWORTHY データベース プロパティ
部分的に信頼される呼び出し元の許容