CREATE ASSEMBLY (Transact-SQL)

適用対象: SQL Server Azure SQL Managed Instance

クラス メタデータとマネージド コードを SQL Server インスタンス内のオブジェクトとして含む、マネージド アプリケーション モジュールを作成します。 データベース内でこのモジュールを参照することにより、共通言語ランタイム (CLR) 関数、ストアド プロシージャ、トリガー、ユーザー定義集計関数、ユーザー定義型を作成できます。

Transact-SQL 構文表記規則

構文

CREATE ASSEMBLY assembly_name
[ AUTHORIZATION owner_name ]
FROM { <client_assembly_specifier> | <assembly_bits> [ , ...n ] }
[ WITH PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE } ]
[ ; ]
<client_assembly_specifier> ::=
    '[ \\computer_name\ ] share_name\ [ path\ ] manifest_file_name'
    | '[ local_path\ ] manifest_file_name'

<assembly_bits> ::=
{ varbinary_literal | varbinary_expression }

引数

assembly_name

アセンブリの名前。 名前はデータベース内で一意であり、有効な識別子であることが必要です。

AUTHORIZATION owner_name

アセンブリの所有者となるユーザーまたはロールの名前を指定します。 owner_nameは、現在のユーザーがメンバーであるロールの名前であるか、現在のユーザーがowner_nameに対するIMPERSONATEアクセス許可を持っている必要があります。 このオプションを指定しない場合は、所有権は現在のユーザーに与えられます。

<client_assembly_specifier>

アップロードされているアセンブリが置かれるローカル パスまたはネットワーク上の位置と、そのアセンブリに対応するマニフェスト ファイル名を指定します。 <client_assembly_specifier> は、固定文字列または変数で固定文字列に評価される式で表すことができます。 CREATE ASSEMBLY では、マルチモジュール アセンブリの読み込みがサポートされていません。 また、SQL Server ではこのアセンブリの依存アセンブリが同じ場所にないか検索され、同じ所有者の依存アセンブリがルート レベル アセンブリとしてアップロードされます。 これらの依存アセンブリが見つかっていなくても、現在のデータベースにまだ読み込まれていない場合、 CREATE ASSEMBLY は失敗します。 依存アセンブリが現在のアセンブリに既に読み込まれている場合、これらのアセンブリの所有者は、新しく作成されたアセンブリの所有者と同じである必要があります。

重要

Azure SQL Database と Azure SQL Managed Instance では、ファイルからのアセンブリの作成はサポートされていません。

<client_assembly_specifier> ログインしているユーザーが偽装されている場合は指定できません。

<assembly_bits>

アセンブリとその依存アセンブリを構成するバイナリ値の一覧。 リストの最初の値は、ルート レベルのアセンブリとして扱われます。 依存アセンブリに対応する値は、任意の順序で指定できます。 ルート アセンブリの依存関係に対応しない値はすべて無視されます。

Note

このオプションは、包含データベースでは使用できません。

varbinary_literal

varbinary リテラル。

varbinary_expression

varbinary 型の式。

PERMISSION_SET { SAFE | EXTERNAL_ACCESS | UNSAFE }

SQL Server によってアクセスされたときにアセンブリに付与されるコード アクセス許可のセットを指定します。 指定しない場合は、 SAFE が既定値として適用されます。

PERMISSION_SET オプションは、Server 構成: clr strict security オプションの影響を受けます。 clr strict security が有効になっていると、すべてのアセンブリが UNSAFE として処理されます。

SAFE の使用を推奨します。 SAFE は最も制限が厳しい権限セットです。 SAFEアクセス許可を持つアセンブリによって実行されるコードは、ファイル、ネットワーク、環境変数、レジストリなどの外部システム リソースにアクセスできません。

EXTERNAL_ACCESS を使用すると、アセンブリは、ファイル、ネットワーク、環境変数、レジストリなどの特定の外部システム リソースにアクセスできます。

UNSAFE を使用すると、SQL Server のインスタンス内と外部の両方で、アセンブリからリソースへの無制限のアクセスが可能になります。 UNSAFE アセンブリ内から実行されているコードは、アンマネージ コードを呼び出すことができます。

SAFE は、SQL Server のインスタンスの外部にあるリソースにアクセスせずに計算タスクとデータ管理タスクを実行するアセンブリに推奨されるアクセス許可設定です。

Note

EXTERNAL_ACCESSUNSAFEのオプションは、包含データベースでは使用できません。

SQL Server のインスタンスの外部にあるリソースにアクセスするアセンブリには、 EXTERNAL_ACCESS を使用することをお勧めします。 EXTERNAL_ACCESS アセンブリには、 SAFE アセンブリの信頼性とスケーラビリティの保護が含まれますが、セキュリティの観点からは、 UNSAFE アセンブリに似ています。 EXTERNAL_ACCESS アセンブリ内のコードは、既定で SQL Server サービス アカウントで実行され、コードが明示的に呼び出し元を偽装しない限り、そのアカウントの外部リソースにアクセスします。 そのため、 EXTERNAL_ACCESS アセンブリを作成するアクセス許可は、SQL Server サービス アカウントでコードを実行するために信頼されているログインにのみ付与する必要があります。 権限借用の詳細については、「CLR 統合のセキュリティ」を参照してください。

UNSAFEを指定すると、アセンブリ内のコードは、SQL Server の堅牢性を損なう可能性がある SQL Server プロセス空間で操作を完全に自由に実行できます。 UNSAFE アセンブリは、SQL Server または共通言語ランタイムのいずれかのセキュリティ システムを破壊する可能性もあります。 UNSAFE アクセス許可は、高信頼アセンブリにのみ付与する必要があります。 sysadmin固定サーバー ロールのメンバーのみがUNSAFEアセンブリを作成および変更できます。

アセンブリ権限セットの詳細については、「 アセンブリの設計」を参照してください。

コード アクセス セキュリティがサポートされなくなりました

CLR では、セキュリティ境界としてサポートされなくなった、.NET Framework のコード アクセス セキュリティ (CAS) が使用されます。 PERMISSION_SET = SAFEで作成された CLR アセンブリは、外部システム リソースへのアクセス、アンマネージ コードの呼び出し、sysadmin 特権の取得が可能な場合があります。 SQL Server 2017 (14.x) 以降のバージョンでは、 sp_configure オプション 厳密なセキュリティにより、CLR アセンブリのセキュリティが強化されます。 clr strict security は既定で有効になり、SAFE および EXTERNAL_ACCESS アセンブリを UNSAFE とマークされている場合と同様に扱います。 clr strict security オプションは下位互換性のために無効にできますが、推奨されません。

証明書または非対称キーによってすべてのアセンブリに署名し、master データベースでUNSAFE ASSEMBLYアクセス許可が付与された対応するログインを使用することをお勧めします。 SQL Server 管理者は、データベース エンジンが信頼するアセンブリのリストにアセンブリを追加することもできます。 詳細については、「sys.sp_add_trusted_assembly」を参照してください。

解説

CREATE ASSEMBLY は、SQL Server のインスタンス内で使用するために、以前に.dll ファイルとしてコンパイルされたアセンブリをマネージド コードからアップロードします。

有効にすると、CREATE ASSEMBLY および ALTER ASSEMBLY のステートメントの PERMISSION_SET オプションが実行時に無視されますが、PERMISSION_SET オプションはメタデータに保持されます。 このオプションを無視すると、既存のコード ステートメントの中断が最小限に抑えられます。

SQL Server では、同じ名前、カルチャ、公開キーを使用して異なるバージョンのアセンブリを登録することはできません。

<client_assembly_specifier>で指定されたアセンブリにアクセスしようとすると、SQL Server は現在の Windows ログインのセキュリティ コンテキストを偽装します。 <client_assembly_specifier>がネットワークの場所 (UNC パス) を指定した場合、委任の制限により、現在のログインの偽装はネットワークの場所に転送されません。 この場合、アクセスは SQL Server サービス アカウントのセキュリティ コンテキストを使って行われます。 詳しくは、「資格情報 (データベース エンジン)」をご覧ください。

assembly_name で指定するルート アセンブリの他に、SQL Server では、アップロードされるルート アセンブリによって参照されているアセンブリのアップロードも試行されます。 以前の CREATE ASSEMBLY ステートメントのために参照先アセンブリが既にデータベースにアップロードされている場合、このアセンブリはアップロードされませんが、ルート アセンブリで使用できます。 依存アセンブリが以前にアップロードされていないが、SQL Server でソース ディレクトリ内にそのマニフェスト ファイルが見つからない場合、 CREATE ASSEMBLY はエラーを返します。

ルート アセンブリによって参照される依存アセンブリがまだデータベースに存在せず、ルート アセンブリと共に暗黙的に読み込まれる場合、ルート レベル アセンブリと同じ権限が設定されます。 ルート レベル アセンブリと異なる権限セットを使って依存アセンブリを作成する必要がある場合は、ルート レベル アセンブリより前に、適切な権限セットが与えられた依存アセンブリを明示的にアップロードする必要があります。

アセンブリの検証

SQL Server は、 CREATE ASSEMBLY ステートメントによってアップロードされたアセンブリ バイナリをスキャンして、次のチェックを保証します。

  • アセンブリ バイナリが有効なメタデータとコード セグメントに基づく整形式になっており、コード セグメントに有効な MSIL (Microsoft Intermediate language) 命令が含まれていること。

  • 参照するシステム アセンブリのセットは、SQL Server でサポートされているアセンブリの 1 つです。 Microsoft.VisualBasic.dllmscorlib.dllSystem.Data.dllSystem.dllSystem.Xml.dllMicrosoft.VisualC.dllCustomMarshallers.dllSystem.Security.dllSystem.Web.Services.dllSystem.Data.SqlXml.dllSystem.Core.dllSystem.Xml.Linq.dll。 他のシステム アセンブリは参照できますが、データベースに明示的に登録されている必要があります。

  • SAFEまたはEXTERNAL ACCESS権限セットを使用して作成されたアセンブリの場合:

    • アセンブリ コードが安全な型であること。 型の安全性は、アセンブリに対して共通言語ランタイム ベリファイアを実行することにより確立されます。

    • 読み取り専用としてマークされていない限り、アセンブリにはクラス内の静的データ メンバーを含めてはなりません。

    • アセンブリ内のクラスにファイナライザー メソッドを含めることはできません。

    • アセンブリのクラスまたはメソッドの注釈が、許可されているコード属性に基づいて設定されていること。 詳細については、「 CLR 統合: CLR ルーチンのカスタム属性」を参照してください。

CREATE ASSEMBLYの実行時に実行される前のチェック以外にも、アセンブリ内のコードの実行時に実行される追加のチェックがあります。

  • アセンブリのアクセス許可セットにそのアクセス許可が含まれていない場合、特定のコード アクセス許可を必要とする特定の .NET Framework API の呼び出しが失敗する可能性があります。

  • SAFEアセンブリとEXTERNAL_ACCESS アセンブリの場合、特定の HostProtectionAttributes で注釈が付けられた .NET Framework API を呼び出そうとすると失敗します。

詳細については、「 アセンブリの設計」を参照してください。

アクセス許可

CREATE ASSEMBLY 権限が必要です。

PERMISSION_SET = EXTERNAL_ACCESSが指定されている場合は、サーバーEXTERNAL ACCESS ASSEMBLYアクセス許可が必要です。 PERMISSION_SET = UNSAFEが指定されている場合は、サーバーUNSAFE ASSEMBLYアクセス許可が必要です。

アップロードするアセンブリによって参照されているアセンブリがデータベース内に存在する場合、ユーザーは、この参照先となるアセンブリの所有者である必要があります。 ファイル パスを使ってアセンブリをアップロードするには、現在のユーザーは、Windows 認証済みログインであるか、sysadmin 固定サーバー ロールのメンバーであることが必要です。 CREATE ASSEMBLYを実行するユーザーの Windows ログインには、共有とステートメントに読み込まれるファイルに対する読み取りアクセス許可が必要です。

CLR の厳密なセキュリティによるアクセス許可

CLR strict security が有効になっている場合に CLR アセンブリを作成するには、次のアクセス許可が必要です。

  • ユーザーには CREATE ASSEMBLY アクセス許可が必要です
  • さらに、次の条件のいずれかを満たす必要があります。
    • サーバーでの UNSAFE ASSEMBLY アクセス許可のある対応するログインを含む証明書または非対称キーでアセンブリが署名されている。 アセンブリへの署名は推奨されます。
    • データベースに ON に設定された TRUSTWORTHY プロパティが含まれ、そのデータベースがサーバーでの UNSAFE ASSEMBLY アクセス許可のあるログインによって所有されている。 "このオプションは推奨されません"。

アセンブリ権限セットの詳細については、「 アセンブリの設計」を参照してください。

A. DLL からアセンブリを作成する

次の例では、SQL Server データベース エンジン サンプルがローカル コンピューターの既定の場所にインストールされ、HelloWorld.csprojサンプル アプリケーションがコンパイルされていることを前提としています。 詳細については、「Hello World サンプル」を参照してください。

CREATE ASSEMBLY HelloWorld
FROM '<system_drive>:\Program Files\Microsoft SQL Server\100\Samples\HelloWorld\CS\HelloWorld\bin\debug\HelloWorld.dll'
WITH PERMISSION_SET = SAFE;

重要

Azure SQL Database では、ファイルからのアセンブリの作成はサポートされていません。

B. アセンブリ ビットからアセンブリを作成する

サンプル ビット (完全または有効ではない) をアセンブリ ビットに置き換えます。

CREATE ASSEMBLY HelloWorld
    FROM 0x4D5A900000000000
WITH PERMISSION_SET = SAFE;