アセンブリの作成

適用対象:SQL Server

ストアド プロシージャやトリガーなどのマネージド データベース オブジェクトは、コンパイルされた後、アセンブリと呼ばれる単位で配置されます。 マネージド DLL アセンブリは、アセンブリが提供する機能を使用する前に、Microsoft 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でアセンブリが作成されると、SQL Serverは、参照先アセンブリがまだデータベースに作成されていない場合に、ルート レベルアセンブリによって参照されるアセンブリも作成します。

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

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

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

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

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

SQL Server データベースにアセンブリを作成するときに、コードを実行できる 3 つの異なるセキュリティ レベル (SAFEEXTERNAL_ACCESSUNSAFE) のいずれかを指定できます。 CREATE ASSEMBLY ステートメントを実行すると、コード アセンブリに対して特定のチェックが実行され、その結果、アセンブリがサーバーへの登録に失敗する可能性があります。

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でEXTERNAL_ACCESSアセンブリまたは UNSAFE アセンブリを作成するには、次の 2 つの条件のいずれかを満たす必要があります。

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

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

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

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

次の Transact-SQL ステートメントは、非対称キーを作成し、ログインをこのキーにマップし、ログインに 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 EXTERNAL ACCESS ASSEMBLY TO SQLCLRTestLogin;   
GO   

注意

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

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

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

次の Transact-SQL ステートメントは、非対称キーを作成し、ログインをこのキーにマップし、そのログインに UNSAFE アクセス許可を付与するために必要な手順を実行します。 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 データベース プロパティ