CREATE ASSEMBLY (Transact-SQL)CREATE ASSEMBLY (Transact-SQL)

適用対象:○SQL Server (2008 以降)○Azure SQL Database (マネージド インスタンスのみ)×Azure SQL Data Warehouse ×Parallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL Database (Managed Instance only)noAzure SQL Data Warehouse noParallel Data Warehouse

クラス メタデータとマネージド コードを SQL ServerSQL Server インスタンス内のオブジェクトとして含む、マネージド アプリケーション モジュールを作成します。Creates a managed application module that contains class metadata and managed code as an object in an instance of SQL ServerSQL Server. データベース内では、このモジュールを参照することにより、共通言語ランタイム (CLR) 関数、ストアド プロシージャ、トリガー、ユーザー定義集計関数、ユーザー定義型を作成できます。By referencing this module, common language runtime (CLR) functions, stored procedures, triggers, user-defined aggregates, and user-defined types can be created in the database.

重要

Azure SQL Database Managed Instance では、この T-SQL 機能の特定の動作が変更されています。On Azure SQL Database Managed Instance, this T-SQL feature has certain behavior changes. すべての T-SQL の動作変更の詳細については、「Azure SQL Database Managed Instance と SQL Server の T-SQL の相違点」を参照してください。See Azure SQL Database Managed Instance T-SQL differences from SQL Server for details for all T-SQL behavior changes.

警告

CLR では、セキュリティ境界としてサポートされなくなった、.NET Framework のコード アクセス セキュリティ (CAS) が使用されます。CLR uses Code Access Security (CAS) in the .NET Framework, which is no longer supported as a security boundary. PERMISSION_SET = SAFE で作成された CLR アセンブリが、外部のシステム リソースにアクセスし、非管理対象コードを呼び出し、sysadmin 特権を取得できる場合があります。A CLR assembly created with PERMISSION_SET = SAFE may be able to access external system resources, call unmanaged code, and acquire sysadmin privileges. SQL Server 2017 (14.x)SQL Server 2017 (14.x) 以降、CLR アセンブリのセキュリティを強化するために clr strict security という sp_configure オプションが導入されました。Beginning with SQL Server 2017 (14.x)SQL Server 2017 (14.x), an sp_configure option called clr strict security is introduced to enhance the security of CLR assemblies. clr strict security は既定で有効になり、SAFE および EXTERNAL_ACCESS アセンブリを UNSAFE とマークされている場合と同様に扱います。clr strict security is enabled by default, and treats SAFE and EXTERNAL_ACCESS assemblies as if they were marked UNSAFE. clr strict security オプションは、旧バージョンとの互換性のために無効にできますが、これは推奨されません。The clr strict security option can be disabled for backward compatibility, but this is not recommended. Microsoft では、master データベースで UNSAFE ASSEMBLY アクセス許可が付与されている対応するログインを含む証明書または非対称キーで、すべてのアセンブリに署名することをお勧めします。Microsoft recommends that all assemblies be signed by a certificate or asymmetric key with a corresponding login that has been granted UNSAFE ASSEMBLY permission in the master database. 詳しくは、「CLR の厳密なセキュリティ」をご覧ください。For more information, see CLR strict security.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

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 }  

引数Arguments

assembly_nameassembly_name
アセンブリの名前を指定します。Is the name of the assembly. 名前はデータベース内で一意であり、有効な識別子であることが必要です。The name must be unique within the database and a valid identifier.

AUTHORIZATION owner_nameAUTHORIZATION owner_name
アセンブリの所有者となるユーザーまたはロールの名前を指定します。Specifies the name of a user or role as owner of the assembly. owner_name に現在のユーザーがメンバーとなっているロールの名前を指定するか、現在のユーザーが owner_name に対する IMPERSONATE 権限を持っている必要があります。owner_name must either be the name of a role of which the current user is a member, or the current user must have IMPERSONATE permission on owner_name. このオプションを指定しない場合は、所有権は現在のユーザーに与えられます。If not specified, ownership is given to the current user.

<client_assembly_specifier><client_assembly_specifier>
アップロードされているアセンブリが置かれるローカル パスまたはネットワーク上の位置と、そのアセンブリに対応するマニフェスト ファイル名を指定します。Specifies the local path or network location where the assembly that is being uploaded is located, and also the manifest file name that corresponds to the assembly. <client_assembly_specifier> は、固定文字列または変数で固定文字列に評価される式で表すことができます。<client_assembly_specifier> can be expressed as a fixed string or an expression evaluating to a fixed string, with variables. CREATE ASSEMBLY では、マルチモジュール アセンブリの読み込みはサポートされません。CREATE ASSEMBLY does not support loading multimodule assemblies. また、 SQL ServerSQL Server ではこのアセンブリの依存アセンブリが同じ場所にないか検索され、同じ所有者の依存アセンブリがルート レベル アセンブリとしてアップロードされます。 SQL ServerSQL Server also looks for any dependent assemblies of this assembly in the same location and also uploads them with the same owner as the root level assembly. これらの依存アセンブリが検出されず、現在のデータベースに読み込まれていない場合、CREATE ASSEMBLY は失敗します。If these dependent assemblies are not found and they are not already loaded in the current database, CREATE ASSEMBLY fails. 依存アセンブリが現在のアセンブリに既に読み込まれている場合、これらのアセンブリの所有者は、新しく作成されたアセンブリの所有者と同じであることが必要です。If the dependent assemblies are already loaded in the current database, the owner of those assemblies must be the same as the owner of the newly created assembly.

ログインしたユーザーの権限が借用されている場合、<client_assembly_specifier> は指定できません。<client_assembly_specifier> cannot be specified if the logged in user is being impersonated.

<assembly_bits><assembly_bits>
アセンブリとその依存アセンブリを構成するバイナリ値のリストを指定します。Is the list of binary values that make up the assembly and its dependent assemblies. リストの最初の値は、ルート レベルのアセンブリとして扱われます。The first value in the list is considered the root-level assembly. 依存アセンブリに対応する値は、任意の順序で指定できます。The values corresponding to the dependent assemblies can be supplied in any order. ルート アセンブリの依存関係に対応していない値は無視されます。Any values that do not correspond to dependencies of the root assembly are ignored.

注意

このオプションは、包含データベースでは使用できません。This option is not available in a contained database.

varbinary_literalvarbinary_literal
varbinary リテラルです。Is a varbinary literal.

varbinary_expressionvarbinary_expression
varbinary 型の式です。Is an expression of type varbinary.

PERMISSION_SET { SAFE | EXTERNAL_ACCESS | UNSAFE }PERMISSION_SET { SAFE | EXTERNAL_ACCESS | UNSAFE }

重要

PERMISSION_SET オプションは、開始の警告で説明されるように、clr strict security オプションの影響を受けます。The PERMISSION_SET option is affected by the clr strict security option, described in the opening warning. clr strict security が有効になっていると、すべてのアセンブリが UNSAFE として処理されます。When clr strict security is enabled, all assemblies are treated as UNSAFE.

SQL ServerSQL Server がアセンブリにアクセスするときに、アセンブリに対して許可されるコード アクセス権のセットを指定します。Specifies a set of code access permissions that are granted to the assembly when it is accessed by SQL ServerSQL Server. 指定しない場合、既定値として SAFE が適用されます。If not specified, SAFE is applied as the default.

SAFE を使用することをお勧めします。We recommend using SAFE. SAFE は最も限定的な権限セットです。SAFE is the most restrictive permission set. SAFE 権限を持つアセンブリによって実行されるコードでは、ファイル、ネットワーク、環境変数、レジストリなどの外部システム リソースにはアクセスできません。Code executed by an assembly with SAFE permissions cannot access external system resources such as files, the network, environment variables, or the registry.

EXTERNAL_ACCESS を指定した場合、アセンブリでは、ファイル、ネットワーク、環境変数、レジストリなどの特定の外部システム リソースにアクセスできます。EXTERNAL_ACCESS enables assemblies to access certain external system resources such as files, networks, environmental variables, and the registry.

注意

このオプションは、包含データベースでは使用できません。This option is not available in a contained database.

UNSAFE を指定した場合、アセンブリでは、 SQL ServerSQL Server インスタンスの内外両方のリソースに制限なしでアクセスできます。UNSAFE enables assemblies unrestricted access to resources, both within and outside an instance of SQL ServerSQL Server. UNSAFE アセンブリ内から実行するコードでは、アンマネージ コードを呼び出すことができます。Code running from within an UNSAFE assembly can call unmanaged code.

注意

このオプションは、包含データベースでは使用できません。This option is not available in a contained database.

重要

アセンブリで、 SQL ServerSQL Server インスタンス外のリソースにアクセスせずに計算やデータ管理タスクを実行する場合は、権限設定として SAFE を使用することをお勧めします。SAFE is the recommended permission setting for assemblies that perform computation and data management tasks without accessing resources outside an instance of SQL ServerSQL Server.

アセンブリで、 SQL ServerSQL Server インスタンス外のリソースにアクセスする場合は、EXTERNAL_ACCESS を使用することをお勧めします。We recommend using EXTERNAL_ACCESS for assemblies that access resources outside of an instance of SQL ServerSQL Server. EXTERNAL_ACCESS アセンブリでは SAFE アセンブリの信頼性とスケーラビリティによる保護が提供されますが、セキュリティの観点からは、このアセンブリは UNSAFE アセンブリと類似しています。EXTERNAL_ACCESS assemblies include the reliability and scalability protections of SAFE assemblies, but from a security perspective are similar to UNSAFE assemblies. EXTERNAL_ACCESS アセンブリ内のコードは、明示的に呼び出し元の権限を借用しない限り、既定により SQL ServerSQL Server サービス アカウントの下で実行され、外部リソースにアクセスします。This is because code in EXTERNAL_ACCESS assemblies runs by default under the SQL ServerSQL Server service account and accesses external resources under that account, unless the code explicitly impersonates the caller. したがって、EXTERNAL_ACCESS アセンブリを作成する権限は、 SQL ServerSQL Server サービス アカウントの下でコードを実行しても安全であると考えられる、信頼できるログインに対してのみ許可してください。Therefore, permission to create EXTERNAL_ACCESS assemblies should be granted only to logins that are trusted to run code under the SQL ServerSQL Server service account. 権限借用の詳細については、「CLR 統合のセキュリティ」を参照してください。For more information about impersonation, see CLR Integration Security.

UNSAFE を指定した場合、アセンブリのコードでは、 SQL ServerSQL Server プロセス領域に対して自由な操作を実行できるので、 SQL ServerSQL Server の堅牢性が脅かされる可能性があります。Specifying UNSAFE enables the code in the assembly complete freedom to perform operations in the SQL ServerSQL Server process space that can potentially compromise the robustness of SQL ServerSQL Server. UNSAFE アセンブリでは、 SQL ServerSQL Server または共通言語ランタイムのいずれかのセキュリティ システムが妨害されるおそれもあります。UNSAFE assemblies can also potentially subvert the security system of either SQL ServerSQL Server or the common language runtime. UNSAFE 権限は、信頼性の高いアセンブリに対してのみ許可してください。UNSAFE permissions should be granted only to highly trusted assemblies. UNSAFE アセンブリを作成または変更できるのは、sysadmin 固定サーバー ロールのメンバーだけです。Only members of the sysadmin fixed server role can create and alter UNSAFE assemblies.

アセンブリの権限セットの詳細については、「アセンブリのデザイン」をご覧ください。For more information about assembly permission sets, see Designing Assemblies.

RemarksRemarks

CREATE ASSEMBLY では、.dll ファイルとしてコンパイル済みのアセンブリがマネージド コードからアップロードされ、SQL Server インスタンス内で使用できるようになります。CREATE ASSEMBLY uploads an assembly that was previously compiled as a .dll file from managed code for use inside an instance of SQL Server.

有効にすると、CREATE ASSEMBLY および ALTER ASSEMBLY のステートメントの PERMISSION_SET オプションが実行時に無視されますが、PERMISSION_SET オプションはメタデータに保持されます。When enabled, the PERMISSION_SET option in the CREATE ASSEMBLY and ALTER ASSEMBLY statements is ignored at run-time, but the PERMISSION_SET options are preserved in metadata. オプションを無視すると、既存のコード ステートメントの改変が最小限に抑えられます。Ignoring the option, minimizes breaking existing code statements.

SQL ServerSQL Server は、名前、カルチャ、および公開キーが同じでありバージョンが異なるアセンブリの登録を許可していません。 does not allow registering different versions of an assembly with the same name, culture and public key.

<client_assembly_specifier> で指定したアセンブリにアクセスしようとすると、 SQL ServerSQL Server では現在の Windows ログインのセキュリティ コンテキストの権限が借用されます。When attempting to access the assembly specified in <client_assembly_specifier>, SQL ServerSQL Server impersonates the security context of the current Windows login. <client_assembly_specifier> でネットワーク上の場所 (UNC パス) を指定した場合は、委任制限があり、現在のログインの権限借用範囲はネットワーク上の場所まで拡大されません。If <client_assembly_specifier> specifies a network location (UNC path), the impersonation of the current login is not carried forward to the network location because of delegation limitations. この場合、アクセスは SQL ServerSQL Server サービス アカウントのセキュリティ コンテキストを使って行われます。In this case, access is made using the security context of the SQL ServerSQL Server service account. 詳細については、「資格情報 (データベース エンジン)」を参照してください。For more information, see Credentials (Database Engine).

assembly_name で指定するルート アセンブリの他に、 SQL ServerSQL Server では、アップロードされるルート アセンブリによって参照されているアセンブリのアップロードも試行されます。Besides the root assembly specified by assembly_name, SQL ServerSQL Server tries to upload any assemblies that are referenced by the root assembly being uploaded. 参照先のアセンブリが、先に実行された CREATE ASSEMBLY ステートメントにより既にアップロードされている場合、そのアセンブリはアップロードされませんが、ルート アセンブリからは引き続き使用できます。If a referenced assembly is already uploaded to the database because of an earlier CREATE ASSEMBLY statement, this assembly is not uploaded but is available to the root assembly. 依存アセンブリがまだアップロードされておらず、 SQL ServerSQL Server ではソース ディレクトリ内にそのアセンブリのマニフェスト ファイルが検出できない場合、CREATE ASSEMBLY ではエラーが返されます。If a dependent assembly was not previously uploaded, but SQL ServerSQL Server cannot locate its manifest file in the source directory, CREATE ASSEMBLY returns an error.

ルート アセンブリにより参照される依存アセンブリがデータベースに存在しておらず、ルート アセンブリと一緒に暗黙的に読み込まれる場合、依存アセンブリにはルート レベル アセンブリと同じ権限セットが与えられます。If any dependent assemblies referenced by the root assembly are not already in the database and are implicitly loaded together with the root assembly, they have the same permission set as the root level assembly. ルート レベル アセンブリと異なる権限セットを使って依存アセンブリを作成する必要がある場合は、ルート レベル アセンブリより前に、適切な権限セットが与えられた依存アセンブリを明示的にアップロードする必要があります。If the dependent assemblies must be created by using a different permission set than the root-level assembly, they must be uploaded explicitly before the root level assembly with the appropriate permission set.

アセンブリの検証Assembly Validation

SQL ServerSQL Server では、CREATE ASSEMBLY ステートメントによりアップロードされたアセンブリ バイナリに対して、次の点を確認するためのチェックが実行されます。 performs checks on the assembly binaries uploaded by the CREATE ASSEMBLY statement to guarantee the following:

  • アセンブリ バイナリが有効なメタデータとコード セグメントに基づく整形式になっており、コード セグメントに有効な MSIL (Microsoft Intermediate language) 命令が含まれていること。The assembly binary is well formed with valid metadata and code segments, and the code segments have valid Microsoft Intermediate language (MSIL) instructions.

  • 参照先の一連のシステム アセンブリが、 SQL ServerSQL 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 つであること。The set of system assemblies it references is one of the following supported assemblies in SQL ServerSQL 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, and System.Xml.Linq.dll. 他のシステム アセンブリは参照できますが、データベースに明示的に登録されている必要があります。Other system assemblies can be referenced, but they must be explicitly registered in the database.

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

    • アセンブリ コードが安全な型であること。The assembly code should be type-safe. 型の安全性は、アセンブリに対して共通言語ランタイム ベリファイアを実行することにより確立されます。Type safety is established by running the common language runtime verifier against the assembly.

    • 読み取り専用とマークされていない静的データ メンバーが、アセンブリのクラス内に含まれていないこと。The assembly should not contain any static data members in its classes unless they are marked as read-only.

    • アセンブリのクラスに、ファイナライザー メソッドが含まれていないこと。The classes in the assembly cannot contain finalizer methods.

    • アセンブリのクラスまたはメソッドの注釈が、許可されているコード属性に基づいて設定されていること。The classes or methods of the assembly should be annotated only with allowed code attributes. 詳細については、「CLR ルーチンのカスタム属性」を参照してください。For more information, see Custom Attributes for CLR Routines.

    これらのチェックは CREATE ASSEMBLY の実行時に行われますが、アセンブリ内のコードの実行時には追加のチェックも行われます。Besides the previous checks that are performed when CREATE ASSEMBLY executes, there are additional checks that are performed at execution time of the code in the assembly:

  • 特定のコード アクセス権を必要とする MicrosoftMicrosoft .NET Framework.NET Framework API を呼び出すときに、アセンブリの権限セットにその権限が含まれていない場合、呼び出しは失敗します。Calling certain MicrosoftMicrosoft .NET Framework.NET Framework APIs that require a specific Code Access Permission may fail if the permission set of the assembly does not include that permission.

  • SAFE と EXTERNAL_ACCESS アセンブリの場合は、特定の HostProtectionAttributes に基づいて注釈が設定されている .NET Framework.NET Framework API を呼び出そうとすると、呼び出しは失敗します。For SAFE and EXTERNAL_ACCESS assemblies, any attempt to call .NET Framework.NET Framework APIs that are annotated with certain HostProtectionAttributes will fail.

    詳細については、「アセンブリのデザイン」を参照してください。For more information, see Designing Assemblies.

アクセス許可Permissions

CREATE ASSEMBLY 権限が必要です。Requires CREATE ASSEMBLY permission.

PERMISSION_SET = EXTERNAL_ACCESS を指定する場合、サーバーに対する EXTERNAL ACCESS ASSEMBLY 権限が必要です。If PERMISSION_SET = EXTERNAL_ACCESS is specified, requiresEXTERNAL ACCESS ASSEMBLY permission on the server. PERMISSION_SET = UNSAFE を指定する場合、サーバーに対する UNSAFE ASSEMBLY 権限が必要です。If PERMISSION_SET = UNSAFE is specified, requires UNSAFE ASSEMBLY permission on the server.

アップロードするアセンブリによって参照されているアセンブリがデータベース内に存在する場合、ユーザーは、この参照先となるアセンブリの所有者であることが必要です。User must be the owner of any assemblies that are referenced by the assembly that are to be uploaded if the assemblies already exist in the database. ファイル パスを使ってアセンブリをアップロードするには、現在のユーザーは、Windows 認証済みログインであるか、sysadmin 固定サーバー ロールのメンバーであることが必要です。To upload an assembly by using a file path, the current user must be a Windows authenticated login or a member of the sysadmin fixed server role. CREATE ASSEMBLY を実行するユーザーの Windows ログインには、共有フォルダーおよびステートメントに読み込まれるファイルに対する読み取り権限が与えられている必要があります。The Windows login of the user that executes CREATE ASSEMBLY must have read permission on the share and the files being loaded in the statement.

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

CLR strict security が有効になっている場合に CLR アセンブリを作成するには、次のアクセス許可が必要です。The following permissions required to create a CLR assembly when CLR strict security is enabled:

  • ユーザーには CREATE ASSEMBLY アクセス許可が必要ですThe user must have the CREATE ASSEMBLY permission
  • さらに、次の条件のいずれかを満たす必要があります。And one of the following conditions must also be true:

    • サーバーでの UNSAFE ASSEMBLY アクセス許可のある対応するログインを含む証明書または非対称キーでアセンブリが署名されている。The assembly is signed with a certificate or asymmetric key that has a corresponding login with the UNSAFE ASSEMBLY permission on the server. アセンブリへの署名は推奨されます。Signing the assembly is recommended.
    • データベースに ON に設定された TRUSTWORTHY プロパティが含まれ、そのデータベースがサーバーでの UNSAFE ASSEMBLY アクセス許可のあるログインによって所有されている。The database has the TRUSTWORTHY property set to ON, and the database is owned by a login that has the UNSAFE ASSEMBLY permission on the server. このオプションは推奨されません。This option is not recommended.

    アセンブリの権限セットの詳細については、「アセンブリのデザイン」をご覧ください。For more information about assembly permission sets, see Designing Assemblies.

使用例Examples

例 a: dll からアセンブリを作成します。Example A: Creating an assembly from a dll

適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017.

次の例では、 SQL Server データベース エンジンSQL Server Database Engine サンプルがローカル コンピューターの既定の場所にインストールされており、HelloWorld.csproj サンプル アプリケーションがコンパイルされていることを前提としています。The following example assumes that the SQL Server データベース エンジンSQL Server Database Engine samples are installed in the default location of the local computer and the HelloWorld.csproj sample application is compiled. 詳細については、「Hello World サンプル」を参照してください。For more information, see Hello World Sample.

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

例 b: アセンブリ ビットからアセンブリを作成します。Example B: Creating an assembly from assembly bits

適用対象: SQL Server 2008:SQL Server 2008 から SQL Server 2017SQL Server 2017Applies to: SQL Server 2008:SQL Server 2008 through SQL Server 2017SQL Server 2017.

(これは、完全性または有効ではありません)、サンプルのビットをアセンブリ ビットに置き換えます。Replace the sample bits (which are not complete or valid) with your assembly bits.

CREATE ASSEMBLY HelloWorld  
    FROM 0x4D5A900000000000  
WITH PERMISSION_SET = SAFE;  

参照See Also

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