CREATE ASSEMBLY (Transact-SQL)

適用対象: SQL ServerAzure SQL Managed Instance

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

警告

CLR では、セキュリティ境界としてサポートされなくなった、.NET Framework のコード アクセス セキュリティ (CAS) が使用されます。 PERMISSION_SET = SAFE で作成された CLR アセンブリが、外部のシステム リソースにアクセスし、非管理対象コードを呼び出し、sysadmin 特権を取得できる場合があります。 SQL Server 2017 (14.x) 以降、CLR アセンブリのセキュリティを強化するために clr strict security という sp_configure オプションが導入されました。 clr strict security は既定で有効になり、SAFE および EXTERNAL_ACCESS アセンブリを UNSAFE とマークされている場合と同様に扱います。 clr strict security オプションは、旧バージョンとの互換性のために無効にできますが、これは推奨されません。 Microsoft では、master データベースで UNSAFE ASSEMBLY アクセス許可が付与されている対応するログインを含む証明書または非対称キーで、すべてのアセンブリに署名することをお勧めします。 詳しくは、「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 }

重要

PERMISSION_SET オプションは、開始の警告で説明されるように、clr strict security オプションの影響を受けます。 clr strict security が有効になっていると、すべてのアセンブリが UNSAFE として処理されます。

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

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

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

Note

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

UNSAFE を指定した場合、アセンブリでは、SQL Server インスタンスの内外両方のリソースに制限なしでアクセスできます。 UNSAFE アセンブリ内から実行するコードでは、アンマネージ コードを呼び出すことができます。

Note

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

重要

アセンブリで、SQL Server インスタンス外のリソースにアクセスせずに計算やデータ管理タスクを実行する場合は、権限設定として SAFE を使用することをお勧めします。

アセンブリで、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 権限は、信頼性の高いアセンブリに対してのみ許可してください。 UNSAFE アセンブリを作成または変更できるのは、sysadmin 固定サーバー ロールのメンバーだけです。

アセンブリの権限セットの詳細については、「アセンブリのデザイン」をご覧ください。

注釈

CREATE ASSEMBLY では、.dll ファイルとしてコンパイル済みのアセンブリがマネージド コードからアップロードされ、SQL Server インスタンス内で使用できるようになります。

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

SQL Server は、名前、カルチャ、および公開キーが同じでありバージョンが異なるアセンブリの登録を許可していません。

<client_assembly_specifier> で指定されているアセンブリにアクセスしようとすると、現在の Windows ログインのセキュリティ コンテキストの権限が SQL Server によって借用されます。 <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 でサポートされているアセンブリ (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) のいずれか 1 つであること。 他のシステム アセンブリは参照できますが、データベースに明示的に登録されている必要があります。

  • SAFE または EXTERNAL ACCESS 権限セットを使用して作成されるアセンブリの場合は、次の点がチェックされます。

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

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

    • アセンブリのクラスに、ファイナライザー メソッドが含まれていないこと。

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

これらのチェックは CREATE ASSEMBLY の実行時に行われますが、アセンブリ内のコードの実行時には追加のチェックも行われます。

  • 特定のコード アクセス権を必要とする Microsoft .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 2008 (10.0.x) 以降。

次の例では、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:アセンブリのビットからアセンブリを作成する

適用対象: SQL Server 2008 (10.0.x) 以降。

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

CREATE ASSEMBLY HelloWorld  
    FROM 0x4D5A900000000000  
WITH PERMISSION_SET = SAFE;  

参照

ALTER ASSEMBLY (Transact-SQL)
DROP ASSEMBLY (Transact-SQL)
CREATE FUNCTION (Transact-SQL)
CREATE PROCEDURE (Transact-SQL)
CREATE TRIGGER (Transact-SQL)
CREATE TYPE (Transact-SQL)
CREATE AGGREGATE (Transact-SQL)
EVENTDATA (Transact-SQL)
CLR (共通言語ランタイム) 統合の使用シナリオと例