次の方法で共有


アセンブリを作成する

適用対象: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 つのセキュリティ レベル (SAFEEXTERNAL_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 つの条件のいずれかを満たす必要があります。

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

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

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

データベースで TRUSTWORTHY データベース プロパティは、サーバー プロセスで共通言語ランタイム (CLR) コードを実行するためだけに に設定しないことをお勧めします。 代わりに、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 統合セキュリティを参照してください。