ALTER ASSEMBLY (Transact-SQL)

適用対象: SQL Server Azure SQL Managed Instance

アセンブリの SQL Server カタログ プロパティを変更することにより、アセンブリを変更します。 ALTER ASSEMBLY は、実装を保持する .NET Framework モジュールの最新のコピーに更新し、それに関連付けられているファイルを追加または削除します。 アセンブリは、CREATE ASSEMBLY を使用して作成されます。

Transact-SQL 構文表記規則

構文

ALTER ASSEMBLY assembly_name
    [ FROM <client_assembly_specifier> | <assembly_bits> ]
    [ WITH <assembly_option> [ , ...n ] ]
    [ DROP FILE { file_name [ , ...n ] | ALL } ]
    [ ADD FILE FROM
    {
        client_file_specifier [ AS file_name ]
      | file_bits AS file_name
    } [ , ...n ]
    ] [ ; ]
<client_assembly_specifier> ::=
    '\\computer_name\share-name\ [ path\ ] manifest_file_name '
  | '[ local_path\ ] manifest_file_name'

<assembly_bits> ::=
    { varbinary_literal | varbinary_expression }

<assembly_option> ::=
    PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE }
  | VISIBILITY = { ON | OFF }
  | UNCHECKED DATA

Note

SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

assembly_name

変更するアセンブリの名前。 assembly_name がデータベースに既に存在する必要があります。

FROM <client_assembly_specifier> | <assembly_bits>

アセンブリを更新し、その実装を保持する .NET Framework モジュールの最新コピーを反映させます。 このオプションを使用できるのは、指定したアセンブリに関連付けられているファイルが存在しない場合だけです。

<client_assembly_specifier> には、更新するアセンブリが配置されているネットワーク上の場所またはローカルの場所を指定します。 ネットワークの場所には、コンピューター名、共有名、およびその共有内のパスが含まれます。 manifest_file_name には、アセンブリのマニフェストを含むファイルの名前を指定します。

重要

Azure SQL Database では、ファイルの参照はサポートされていません。

<assembly_bits> はアセンブリのバイナリ値です。

更新も必要な依存アセンブリに対して、個別の ALTER ASSEMBLY ステートメントを発行する必要があります。

PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE }

アセンブリの .NET Framework コード アクセス権セットのプロパティを指定します。 このプロパティの詳細については、「 CREATE ASSEMBLYを参照してください。

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

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

VISIBILITY = { ON | OFF }

アセンブリに対する共通言語ランタイム (CLR) 関数、ストアド プロシージャ、トリガー、ユーザー定義型、およびユーザー定義集計関数の作成時に、そのアセンブリが表示されるかどうかを指定します。 OFFに設定すると、アセンブリは他のアセンブリによってのみ呼び出されます。 アセンブリに対して既に作成されている CLR データベース オブジェクトが存在する場合、アセンブリの可視性を変更することはできません。 assembly_name によって参照されるアセンブリは、既定では非表示としてアップロードされます。

UNCHECKED DATA

既定では、個々のテーブル行の整合性を確認する必要がある場合、 ALTER ASSEMBLY は失敗します。 このオプションを使用すると、 DBCC CHECKTABLEを使用して後でチェックを延期できます。 指定した場合、SQL Server は、次の条件を含むテーブルがデータベースに存在する場合でも、 ALTER ASSEMBLY ステートメントを実行します。

  • Transact-SQL 関数やメソッドから直接または間接的にアセンブリ内のメソッドを参照する、保存される計算列。

  • CHECK アセンブリ内のメソッドを直接または間接的に参照する制約。

  • アセンブリに依存する CLR ユーザー定義型の列と、その型は UserDefined (非Native) シリアル化形式を実装します。

  • WITH SCHEMABINDINGを使用して作成されたビューを参照する CLR ユーザー定義型の列。

CHECK制約が存在する場合は無効になり、信頼されていないとマークされます。 アセンブリに依存する列が含まれるテーブルは、明示的に検証されるまで、未検証のデータが含まれていることを示すマークが付きます。

このオプションを指定できるのは、db_owner 固定データベース ロールと db_ddlowner 固定データベース ロールのメンバーだけです。

このオプションを指定するには、 ALTER ANY SCHEMA アクセス許可が必要です。

詳細については、「 アセンブリの実装を参照してください。

DROP FILE { file_name [ ,...n ] |ALL }

アセンブリに関連付けられているファイル名、またはアセンブリに関連付けられているすべてのファイルを、データベースから削除します。 次の ADD FILE で使用する場合は、最初に DROP FILE 実行されます。 これにより、同じファイル名でファイルを置き換えることができます。

Note

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

ADD FILE FROM { client_file_specifier [ AS file_name ] | as file_name } をfile_bitsする

ソース コード、デバッグ ファイル、その他の関連情報など、アセンブリに関連付けられているファイルをサーバーにアップロードし、 sys.assembly_files カタログ ビューに表示します。 client_file_specifier には、ファイルのアップロード元となる場所を指定します。 file_bits を代わりに使用し、ファイルを構成するバイナリ値の一覧を指定できます。 file_name には、SQL Server のインスタンスに格納する必要があるファイルの名前を指定します。 file_name は、file_bits が指定されている場合は指定する必要があり、client_file_specifier が指定されている場合はオプションになります。 file_nameが指定されていない場合、client_file_specifierのfile_name部分がfile_nameとして使用されます。

Note

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

コード アクセス セキュリティがサポートされなくなりました

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 オプションは下位互換性のために無効にできますが、推奨されません。

証明書または非対称キーによってすべてのアセンブリに署名し、master データベースでUNSAFE ASSEMBLYアクセス許可が付与された対応するログインを使用することをお勧めします。 SQL Server 管理者は、データベース エンジンが信頼するアセンブリのリストにアセンブリを追加することもできます。 詳細については、「sys.sp_add_trusted_assembly」を参照してください。

解説

ALTER ASSEMBLY は、変更中のアセンブリでコードを実行している現在実行中のセッションを中断しません。 現在のセッションは、アセンブリの変更されていないビット列を使用して最後まで実行されます。

FROM句が指定されている場合、ALTER ASSEMBLYは、提供されたモジュールの最新のコピーに関してアセンブリを更新します。 アセンブリに対して既に定義されている SQL Server のインスタンスには CLR 関数、ストアド プロシージャ、トリガー、データ型、ユーザー定義集計関数が存在する可能性があるため、 ALTER ASSEMBLY ステートメントはアセンブリの最新の実装に再バインドします。 この再バインドを適切に行うには、CLR 関数、ストアド プロシージャ、およびトリガーにマップされるメソッドが、同じ署名を持つ変更済みのアセンブリ内に存在している必要があります。 CLR ユーザー定義型とユーザー定義集計関数が実装されているクラスは、ユーザー定義型または集計の要件を満たしている必要があります。

注意事項

WITH UNCHECKED DATAが指定されていない場合、SQL Server は、新しいアセンブリ バージョンがテーブル、インデックス、またはその他の永続的なサイト内の既存のデータに影響を与える場合に、ALTER ASSEMBLYの実行を防止しようとします。 ただし、SQL Server では、CLR アセンブリの更新時に、計算列、インデックス、インデックス付きビュー、または式が基になるルーチンおよび型と一致することが保証されません。 ALTER ASSEMBLYを実行するときは注意して、式の結果と、アセンブリに格納されている式に基づく値の間に不一致がないことを確認してください。

ALTER ASSEMBLY はアセンブリのバージョンを変更します。 アセンブリのカルチャおよび公開キー トークンは変更されません。

ALTER ASSEMBLY ステートメントを使用して、次の項目を変更することはできません。

  • アセンブリを参照する、SQL Server インスタンス内の CLR 関数、集計関数、ストアド プロシージャ、およびトリガーの署名。 SQL Server が新しいバージョンのアセンブリを使用して SQL Server の .NET Framework データベース オブジェクトを再バインドできない場合、ALTER ASSEMBLY は失敗します。

  • 別のアセンブリから呼び出されるアセンブリ内のメソッドの署名。

  • アセンブリの DependentList プロパティで参照されるアセンブリに依存するアセンブリの一覧。

  • メソッドのインデックス機能。ただし、直接または間接的にそのメソッドに依存するインデックスや保存される計算列が存在する場合に限ります。

  • CLR テーブル値関数の FillRow メソッド名属性。

  • ユーザー定義集計の Accumulate および Terminate メソッドシグネチャ。

  • システム アセンブリ。

  • アセンブリの所有権。 代わりに ALTER AUTHORIZATION を使用してください。

さらに、ユーザー定義型を実装するアセンブリの場合、 ALTER ASSEMBLY を使用して次の変更のみを行うことができます。

  • シグネチャまたは属性が変更されない限り、ユーザー定義型クラスのパブリック メソッドを変更する。

  • 新しいパブリック メソッドの追加。

  • 任意の方法でのプライベート メソッドの変更。

ネイティブ シリアル化されたユーザー定義型 (データ メンバーや基底クラスを含む) に含まれるフィールドは、 ALTER ASSEMBLYを使用して変更することはできません。 その他の変更はいずれもサポートされていません。

ADD FILE FROMが指定されていない場合、アセンブリに関連付けられているファイルALTER ASSEMBLY削除されます。

UNCHECKED データ句なしでALTER ASSEMBLYが実行された場合は、新しいアセンブリ バージョンがテーブル内の既存のデータに影響しないことを確認するチェックが実行されます。 チェックする必要があるデータの量によっては、この手順がパフォーマンスに影響する可能性があります。

アクセス許可

アセンブリ ALTER 権限が必要です。 その他に次の要件があります。

  • 既存の権限セットが EXTERNAL_ACCESSアセンブリを変更するには、サーバー EXTERNAL ACCESS ASSEMBLY 権限が必要です。

  • 既存の権限セットが UNSAFE アセンブリを変更するには、サーバー UNSAFE ASSEMBLY 権限が必要です。

  • アセンブリの権限セットを EXTERNAL_ACCESSに変更するには、サーバーに対する EXTERNAL ACCESS ASSEMBLY 権限が必要です。

  • アセンブリの権限セットを UNSAFEに変更するには、サーバーに対する UNSAFE ASSEMBLY 権限が必要です。

  • WITH UNCHECKED DATAを指定するには、ALTER ANY SCHEMAアクセス許可が必要です。

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

clr strict security が有効になっている場合に CLR アセンブリを変更するには、次のアクセス許可が必要です。

  • ユーザーには ALTER ASSEMBLY アクセス許可が必要です

  • さらに、次の条件のいずれかを満たす必要があります。

    • サーバーでの UNSAFE ASSEMBLY アクセス許可のある対応するログインを含む証明書または非対称キーでアセンブリが署名されている。 アセンブリへの署名は推奨されます。

    • データベースに ON に設定された TRUSTWORTHY プロパティが含まれ、そのデータベースがサーバーでの UNSAFE ASSEMBLY アクセス許可のあるログインによって所有されている。 "このオプションは推奨されません"。

アセンブリ権限セットの詳細については、「 アセンブリの設計」を参照してください。

A. アセンブリを更新する

次の例では、ComplexNumber アセンブリを更新し、その実装を保持する .NET Framework モジュールの最新コピーを反映させます。

Note

アセンブリ ComplexNumber は、 UserDefinedDataType サンプル スクリプトを実行することで作成できます。 詳細については、「ユーザー定義型」を参照してください。

 ALTER ASSEMBLY ComplexNumber
 FROM 'C:\Program Files\Microsoft SQL Server\130\Tools\Samples\1033\Engine\Programmability\CLR\UserDefinedDataType\CS\ComplexNumber\obj\Debug\ComplexNumber.dll'

重要

Azure SQL Database では、ファイルの参照はサポートされていません。

B. アセンブリに関連付けるファイルを追加する

次の例では、ソース コード ファイル Class1.cs をアップロードして、アセンブリ MyClass に関連付けます。 この例では、アセンブリ MyClass がデータベースに既に作成されていることを前提としています。

ALTER ASSEMBLY MyClass
ADD FILE FROM 'C:\MyClassProject\Class1.cs';

重要

Azure SQL Database では、ファイルの参照はサポートされていません。

C: アセンブリの権限を変更する

次の例では、アセンブリ ComplexNumber の権限セットを、SAFE から EXTERNAL ACCESS に変更します。

ALTER ASSEMBLY ComplexNumber WITH PERMISSION_SET = EXTERNAL_ACCESS;