ALTER ASSEMBLY (Transact-SQL)
適用対象: SQL Server Azure SQL Managed Instance
アセンブリの SQL Server カタログ プロパティを変更することにより、アセンブリを変更します。 ALTER ASSEMBLY
は、実装を保持する .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 には、アセンブリのマニフェストを含むファイルの名前を指定します。
重要
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_ACCESS
とUNSAFE
のオプションは、包含データベースでは使用できません。
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
オプションは、旧バージョンとの互換性のために無効にできますが、推奨されません。
すべてのアセンブリに対して、UNSAFE ASSEMBLY
データベース内で master
権限が付与された対応するログインを持つ認定資格証または非対称キーで署名することをお勧めします。 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;