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)noAzure SQL DatabasenoAzure 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.

警告

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 2017SQL Server 2017 以降、CLR アセンブリのセキュリティを強化するために clr strict security という sp_configure オプションが導入されました。Beginning with SQL Server 2017SQL Server 2017, 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うち、現在のユーザーがメンバー、または現在のユーザーでは、に対する IMPERSONATE 権限が必要なロールの名前を指定するかする必要owner_nameです。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同じ場所にこのアセンブリの依存アセンブリの検索し、ルート レベル アセンブリとして、同じ所有者アップロードされます。 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オプション、opening 警告で説明します。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. メンバーにのみ、 sysadmin固定サーバー ロールの作成し、UNSAFE アセンブリを変更できます。Only members of the sysadmin fixed server role can create and alter UNSAFE assemblies.

アセンブリの権限セットの詳細については、次を参照してください。アセンブリの設計です。For more information about assembly permission sets, see Designing Assemblies.

解説Remarks

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_nameSQL 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 アセンブリでは、しようとする呼び出し .NET Framework.NET Framework特定の HostProtectionAttributes で注釈が付けられている 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

アセンブリの変更 (です。TRANSACT-SQL と #41 です。 ALTER ASSEMBLY (Transact-SQL)
アセンブリ ( を削除します。TRANSACT-SQL と #41 です。 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)
集計 ( を作成します。TRANSACT-SQL と #41 です。 CREATE AGGREGATE (Transact-SQL)
EVENTDATA (Transact-SQL) EVENTDATA (Transact-SQL)
使用シナリオと例については、共通言語ランタイム (です。CLR )統合Usage Scenarios and Examples for Common Language Runtime (CLR) Integration