ALTER ASSEMBLY (Transact-SQL)
アセンブリの SQL Server カタログ プロパティを変更することにより、アセンブリを変更します。ALTER ASSEMBLY では、アセンブリの実装を保持する Microsoft .NET Framework モジュールの最新コピーが反映されるようにアセンブリを更新し、アセンブリに関連付けられているファイルを追加または削除します。アセンブリは、CREATE ASSEMBLY を使用して作成されます。
構文
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
引数
assembly_name
変更するアセンブリの名前を指定します。assembly_name はデータベース内に存在する必要があります。FROM <client_assembly_specifier> | <assembly_bits>
アセンブリを更新して、アセンブリの実装を保持する .NET Framework モジュールの最新コピーを反映させます。このオプションを使用できるのは、指定したアセンブリに関連付けられているファイルが存在しない場合だけです。<client_assembly_specifier> には、更新するアセンブリが配置されているネットワーク上の場所またはローカルの場所を指定します。ネットワーク上の場所を指定する場合は、コンピューター名、共有名、および共有内のパスを指定します。manifest_file_name には、アセンブリのマニフェストを含むファイルの名前を指定します。
<assembly_bits> は、アセンブリのバイナリ値です。
更新も必要な依存アセンブリに対して、個別の ALTER ASSEMBLY ステートメントを実行する必要があります。
PERMISSION_SET = { SAFE | EXTERNAL_ACCESS | UNSAFE }
アセンブリの .NET Framework コード アクセス権セットのプロパティを指定します。このプロパティの詳細については、「CREATE ASSEMBLY (Transact-SQL)」を参照してください。VISIBILITY = { ON | OFF }
アセンブリに対する共通言語ランタイム (CLR) 関数、ストアド プロシージャ、トリガー、ユーザー定義型、およびユーザー定義集計関数の作成時に、そのアセンブリが表示されるかどうかを指定します。OFF に設定した場合、アセンブリは、他のアセンブリによってのみ呼び出されます。アセンブリに対して既に作成された CLR データベース オブジェクトが存在する場合、そのアセンブリの表示は変更できません。assembly_name によって参照されるアセンブリは、既定では非表示としてアップロードされます。UNCHECKED DATA
既定では、個々のテーブル行の一貫性を検証する必要がある場合、ALTER ASSEMBLY は失敗します。このオプションを指定すると、DBCC CHECKTABLE によって、この検証を延期することができます。これを指定した場合、SQL Server では、データベースのテーブルに次のデータが含まれていても、ALTER ASSEMBLY ステートメントが実行されます。Transact-SQL 関数やメソッドから直接または間接的にアセンブリ内のメソッドを参照する、保存される計算列。
直接または間接的にアセンブリ内のメソッドを参照する、CHECK 制約。
アセンブリに依存する CLR ユーザー定義型の列、および UserDefined (非ネイティブ) シリアル化形式を実装する型の列。
WITH SCHEMABINDING を使用して作成されたビューを参照する、CLR ユーザー定義型の列。
CHECK 制約がある場合、これらのデータは無効になり、信頼されていないことを示すマークが付きます。アセンブリに依存する列が含まれるテーブルは、明示的に検証されるまで、未検証のデータが含まれていることを示すマークが付きます。
このオプションを指定できるのは、db_owner 固定データベース ロールおよび db_ddlowner 固定データベース ロールのメンバーだけです。
詳細については、「アセンブリの実装」を参照してください。
[ DROP FILE { file_name[ ,...n] | ALL } ]
アセンブリに関連付けられているファイル名、またはアセンブリに関連付けられているすべてのファイルを、データベースから削除します。続けて ADD FILE を指定する場合は、最初に DROP FILE が実行されます。このため、同じファイル名でファイルを置き換えることができます。[ ADD FILE FROM { client_file_specifier [ AS file_name] | file_bitsAS file_name}
ソース コード、デバッグ ファイル、その他の関連情報など、アセンブリに関連付けられているファイルをサーバーにアップロードし、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 として使用されます。
説明
変更するアセンブリ内のコードが、現在実行中のセッションで実行されている場合、ALTER ASSEMBLY でセッションは中断されません。現在のセッションは、アセンブリの変更されていないビット列を使用して最後まで実行されます。
FROM 句を指定した場合、ALTER ASSEMBLY では、指定したモジュールの最新コピーが反映されるようにアセンブリが更新されます。SQL Server インスタンス内に CLR 関数、ストアド プロシージャ、トリガー、データ型、およびユーザー定義集計関数が存在し、これらがアセンブリに対して既に定義されている場合があるため、ALTER ASSEMBLY ステートメントでは、これらがアセンブリの最新の実装に再バインドされます。この再バインドを適切に行うには、CLR 関数、ストアド プロシージャ、およびトリガーにマップされるメソッドが、同じ署名を持つ変更済みのアセンブリ内に存在している必要があります。CLR ユーザー定義型とユーザー定義集計関数が実装されているクラスは、ユーザー定義型または集計の要件を満たしている必要があります。
注意 |
---|
WITH UNCHECKED DATA を指定せず、新しいバージョンのアセンブリによってテーブルの既存のデータ、インデックス、または他の固有サイトに影響が生じる場合、SQL Server では ALTER ASSEMBLY の実行回避が試みられます。ただし、CLR アセンブリが更新された場合、計算列、インデックス、インデックス付きビュー、または式と、基になるルーチンおよびデータ型との一貫性は、SQL Server では保証されません。式の結果と、アセンブリに格納されている式に基づく値に不一致がないかどうかを ALTER ASSEMBLY で確認する場合は注意してください。 |
ALTER ASSEMBLY ではアセンブリのバージョンが変更されます。アセンブリのカルチャおよび公開キー トークンは変更されません。
ALTER ASSEMBLY ステートメントを使用しても、次の情報は変更できません。
アセンブリを参照する、SQL Server インスタンス内の CLR 関数、集計関数、ストアド プロシージャ、およびトリガーの署名。SQL Server で、SQL Server 内の .NET Framework データベース オブジェクトを新しいバージョンのアセンブリに再バインドできない場合、ALTER ASSEMBLY は失敗します。
別のアセンブリから呼び出されるアセンブリ内のメソッドの署名。
アセンブリに依存するアセンブリの一覧。この一覧はアセンブリの DependentList プロパティ内で参照されます。
メソッドのインデックス機能。ただし、直接または間接的にそのメソッドに依存するインデックスや保存される計算列が存在する場合に限ります。
CLR テーブル値関数の FillRow メソッド名の属性。
ユーザー定義集計用の Accumulate および Terminate メソッドの署名。
システム アセンブリ。
アセンブリの所有権。代わりに ALTER AUTHORIZATION (Transact-SQL) を使用します。
さらに、ユーザー定義型を実装するアセンブリに対しては、ALTER ASSEMBLY を使用して次の変更だけを行えます。
ユーザー定義型クラスのパブリック メソッドの変更 (署名または属性が変更されない場合のみ)。
新しいパブリック メソッドの追加。
プライベート メソッドの変更。
データ メンバーやベース クラスなど、ネイティブでシリアル化されたユーザー定義型に含まれるフィールドは、ALTER ASSEMBLY では変更できません。その他すべての変更はサポートされていません。
ADD FILE FROM を指定しない場合、ALTER ASSEMBLY ではそのアセンブリに関連付けられているファイルが削除されます。
UNCHECKED データ句を指定せずに ALTER ASSEMBLY を実行した場合は、新しいバージョンのアセンブリがテーブル内の既存のデータに影響しないかどうかを検証するためのチェックが行われます。チェックの対象となるデータ量によっては、パフォーマンスが影響を受ける場合があります。
権限
アセンブリに対する ALTER 権限が必要です。その他、次の追加要件があります。
既存の権限セットが EXTERNAL_ACCESS になっているアセンブリを変更するには、SQL Server ログインは、そのサーバーに対する EXTERNAL ACCESS 権限を保持している必要があります。
既存の権限セットが UNSAFE になっているアセンブリを変更するには、sysadmin 固定サーバー ロールのメンバーシップが必要です。
アセンブリの権限セットを EXTERNAL_ACCESS に変更するには、SQL Server ログインは、そのサーバーに対する EXTERNAL ACCESS ASSEMBLY 権限を保持している必要があります。
アセンブリの権限セットを UNSAFE に変更するには、sysadmin 固定サーバー ロールのメンバーシップが必要です。
WITH UNCHECKED DATA を指定するには、sysadmin 固定サーバー ロールのメンバーシップが必要です。
アセンブリの権限セットの詳細については、「アセンブリのデザイン」を参照してください。
例
A. アセンブリを更新する
次の例では、ComplexNumber アセンブリを更新して、その実装を保持する .NET Framework モジュールの最新コピーを反映させます。
注 |
---|
アセンブリ ComplexNumber は、サンプル スクリプト UserDefinedDataType を実行することによって作成できます。詳細については、「SQL Server のサンプルとサンプル データベースのインストールに関する注意点」を参照してください。 |
ALTER ASSEMBLY ComplexNumber
FROM 'C:\Program Files\Microsoft SQL Server\90\Tools\Samples\1033\Engine\Programmability\CLR\UserDefinedDataType\CS\ComplexNumber\obj\Debug\ComplexNumber.dll'
B. ファイルを追加してアセンブリに関連付ける
次の例では、ソース コード ファイル Class1.cs をアップロードして、アセンブリ MyClass に関連付けます。この例では、アセンブリ MyClass がデータベースに既に作成されていることを前提としています。
ALTER ASSEMBLY MyClass
ADD FILE FROM 'C:\MyClassProject\Class1.cs';
C. アセンブリの権限を変更する
次の例では、アセンブリ ComplexNumber の権限セットを、SAFE から EXTERNAL ACCESS に変更します。
ALTER ASSEMBLY ComplexNumber WITH PERMISSION_SET = EXTERNAL_ACCESS