CREATE ASSEMBLY (Transact-SQL)
適用対象: SQL Server Azure SQL Managed Instance
クラス メタデータとマネージド コードを SQL Server インスタンス内のオブジェクトとして含む、マネージド アプリケーション モジュールを作成します。 データベース内でこのモジュールを参照することにより、共通言語ランタイム (CLR) 関数、ストアド プロシージャ、トリガー、ユーザー定義集計関数、ユーザー定義型を作成できます。
構文
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_ACCESS
とUNSAFE
のオプションは、包含データベースでは使用できません。
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
オプションは、旧バージョンとの互換性のために無効にできますが、推奨されません。
すべてのアセンブリに対して、UNSAFE ASSEMBLY
データベース内で master
権限が付与された対応するログインを持つ認定資格証または非対称キーで署名することをお勧めします。 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.dll
、mscorlib.dll
、System.Data.dll
、System.dll
、System.Xml.dll
、Microsoft.VisualC.dll
、CustomMarshallers.dll
、System.Security.dll
、System.Web.Services.dll
、System.Data.SqlXml.dll
、System.Core.dll
、System.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;