アセンブリを作成する
適用対象:SQL Server
ストアド プロシージャやトリガーなどのマネージド データベース オブジェクトは、コンパイルされた後、アセンブリと呼ばれる単位で配置されます。 マネージド 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 データベースにアセンブリを作成する場合は、コードを実行できる 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
コードのアクセス許可は、アセンブリが検証可能に安全ではない、または 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 つが満たされている必要があります。
データベースで 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
アセンブリを作成するには、アセンブリの作成時に 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 統合 Code Access Security の
- TRUSTWORTHY データベース プロパティの