CREATE ASSEMBLY (Transact-SQL)
クラス メタデータとマネージ コードを 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 は失敗します。依存アセンブリが現在のアセンブリに既に読み込まれている場合、これらのアセンブリの所有者は、新しく作成されたアセンブリの所有者と同じであることが必要です。ログインしたユーザーの権限が借用されている場合、<client_assembly_specifier> は指定できません。
<assembly_bits>
アセンブリとその依存アセンブリを構成するバイナリ値のリストを指定します。リストの最初の値は、ルート レベルのアセンブリとして扱われます。依存アセンブリに対応する値は、任意の順序で指定できます。ルート アセンブリの依存関係に対応していない値は無視されます。varbinary_literal
varbinary 型のリテラルを指定します。varbinary_expression
varbinary 型の式を指定します。PERMISSION_SET { SAFE | EXTERNAL_ACCESS | UNSAFE }
SQL Server がアセンブリにアクセスするときに、アセンブリに対して許可されるコード アクセス権のセットを指定します。指定しない場合、既定値として SAFE が適用されます。SAFE を使用することをお勧めします。SAFE は最も限定的な権限セットです。SAFE 権限を持つアセンブリによって実行されるコードでは、ファイル、ネットワーク、環境変数、レジストリなどの外部システム リソースにはアクセスできません。
EXTERNAL_ACCESS を指定した場合、アセンブリでは、ファイル、ネットワーク、環境変数、レジストリなどの特定の外部システム リソースにアクセスできます。
UNSAFE を指定した場合、アセンブリでは、SQL Server インスタンスの内外両方のリソースに制限なしでアクセスできます。UNSAFE アセンブリ内から実行するコードでは、アンマネージ コードを呼び出すことができます。
セキュリティに関する注意 アセンブリで、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 インスタンス内で使用できるようになります。
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 でサポートされているアセンブリ (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 を指定する場合、SQL Server ログインには、サーバーに対する EXTERNAL ACCESS ASSEMBLY 権限が必要です。PERMISSION_SET = UNSAFE を指定する場合、sysadmin 固定サーバー ロールのメンバシップが必要です。
アップロードするアセンブリによって参照されているアセンブリがデータベース内に存在する場合、ユーザーは、この参照先となるアセンブリの所有者であることが必要です。ファイル パスを使ってアセンブリをアップロードするには、現在のユーザーは、Windows 認証済みログインであるか、sysadmin 固定サーバー ロールのメンバであることが必要です。CREATE ASSEMBLY を実行するユーザーの Windows ログインには、共有フォルダおよびステートメントに読み込まれるファイルに対する読み取り権限が与えられている必要があります。
アセンブリの権限セットの詳細については、「アセンブリのデザイン」を参照してください。
例
次の例では、SQL Server データベース エンジン サンプルがローカル コンピュータの既定の場所にインストールされており、HelloWorld.csproj サンプル アプリケーションがコンパイルされていることを前提としています。詳細については、「Hello World Sample」を参照してください。
DECLARE @SamplesPath nvarchar(1024)
SELECT @SamplesPath = REPLACE(physical_name,
'Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\master.mdf',
'Microsoft SQL Server\90\Samples\Engine\Programmability\CLR\')
FROM master.sys.database_files
WHERE name = 'master';
CREATE ASSEMBLY HelloWorld
FROM @SamplesPath + 'HelloWorld\CS\HelloWorld\bin\debug\HelloWorld.dll'
WITH PERMISSION_SET = SAFE;