アセンブリの作成

ストアド プロシージャやトリガーなどのマネージ データベース オブジェクトは、コンパイルされた後、アセンブリと呼ばれる単位で配置されます。マネージ 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 つのセキュリティ レベル (SAFE、EXTERNAL_ACCESS、UNSAFE) のうちの 1 つを指定できます。CREATE ASSEMBLY ステートメントを実行する際には、アセンブリによる登録を失敗させる可能性があるコード アセンブリに対し、特定のチェックがサーバー上で実行されます。詳細については、CodePlex の Impersonation サンプルを参照してください。また、「SQL Server データベース エンジン サンプル」も参照してください。

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 権限を与えるために必要なステップを実行します。次に示す Transact-SQL ステートメントは、CREATE ASSEMBLY ステートメントを実行する前に実行する必要があります。

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 権限を与えるために必要なステップを実行します。次に示す Transact-SQL ステートメントは、CREATE ASSEMBLY ステートメントを実行する前に実行する必要があります。

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 統合のセキュリティ」を参照してください。