ストアド プロシージャやトリガーなどのマネージド データベース オブジェクトは、コンパイルされた後、アセンブリと呼ばれる単位で配置されます。 マネージド 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
ステートメントを実行すると、コード アセンブリに対して特定のチェックが実行され、その結果、アセンブリがサーバーへの登録に失敗する可能性があります。 詳細については、 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 で 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
に設定しないことをお勧めします。 代わりに、マスター データベースのアセンブリ ファイルから非対称キーを作成することをお勧めします。 その後、この非対称キーにマップされたログインを作成し、ログインに 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
注
非対称キーに関連付ける新しいログインを作成する必要があります。 このログインは、アクセス許可を付与するためにのみ使用されます。ユーザーに関連付けたり、アプリケーション内で使用したりする必要はありません。
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 Integration Security」を参照してください。
こちらもご覧ください
CLR 統合アセンブリの管理
アセンブリの変更
アセンブリの削除
CLR 統合コード アクセス セキュリティ
TRUSTWORTHY データベース プロパティ
部分的に信頼された呼び出し元を許可する