アセンブリの作成
適用対象: 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 つの異なるセキュリティ レベル ( SAFE、、 EXTERNAL_ACCESS、または UNSAFE のいずれかを指定できます。 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 つの条件のいずれかを満たす必要があります。
アセンブリが、厳密な名前で署名されているか、または証明書を使用して Authenticode で署名されている。 この厳密な名前 (または証明書) は、非対称キー (または証明書) として SQL Server 内に作成され、 EXTERNAL ACCESS ASSEMBLY アクセス許可 (外部アクセス アセンブリの場合) または UNSAFE ASSEMBLY アクセス許可 (安全でないアセンブリの場合) を持つ対応するログインを持ちます。
データベース所有者 (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
Note
非対称キーに関連付ける新しいログインを作成する必要があります。 このログインは、権限を許可するためにのみ使用します。このログインをユーザーに関連付けたり、アプリケーション内で使用したりする必要はありません。
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 Integration Security」を参照してください。
参照
CLR 統合アセンブリの管理
アセンブリの変更
アセンブリの削除
CLR 統合のコード アクセス セキュリティ
TRUSTWORTHY データベース プロパティ