データベース・オブジェクトのソフトな無効化

ソフトな無効化 がアクティブな場合は、実行中の他のトランザクションが使用しているオブジェクトでもドロップできます。 ドロップされるオブジェクトを使用していたトランザクションは続行を許可されますが、ドロップされるオブジェクトに新しいトランザクションがアクセスすることは拒否されます。

キャッシュされたステートメントおよびパッケージのうち、ドロップまたは変更されているオブジェクトを直接または間接的に参照するものはすべて、無効とマークされます (無効化された といいます)。 ソフトな無効化以外の方法では、実行中のステートメントが参照先オブジェクトのロックを保持するために待機が発生しますが、ソフトな無効化では、参照オブジェクトに影響を与える DDL がこうした待機を回避できます。また、アクティブ・アクセスはキャッシュ・バージョンのオブジェクトを使用して続行できるので、ロック・タイムアウトの可能性がなくなります。

一方、ハードな無効化 を使用した場合は、オブジェクトを参照するときに排他ロッキングが使用されます。 これによって、すべてのプロセスが同一バージョンのオブジェクトを使用することが保証されますが、いったんドロップされたオブジェクトにはアクセスできなくなります。

ソフトな無効化は、DB2_DDL_SOFT_INVAL レジストリー変数を使用して有効にします。デフォルトでは、このレジストリー変数は ON に設定されています。

以下のリストは、ソフトな無効化がサポートされるデータ定義言語 (DDL) ステートメントを示しています。
  • ALTER TABLE...DETACH PARTITION
  • CREATE OR REPLACE ALIAS
  • CREATE OR REPLACE FUNCTION
  • CREATE OR REPLACE TRIGGER
  • CREATE OR REPLACE VIEW
  • DROP ALIAS
  • DROP FUNCTION
  • DROP TRIGGER
  • DROP VIEW
注: Db2® バージョン 9.7 フィックスパック 1 以降のリリースでは、ALTER TABLE ...DETACH PARTITION は、パーティション表を直接または間接的に参照するキャッシュされたステートメントに対して、すべての分離レベルでソフトな無効化を実行します。 後続の非同期パーティション・デタッチ・タスクは、デタッチされたパーティションをスタンドアロンの表に変換する前に、ソフトな無効化が以前に行われているキャッシュされたステートメントに対してハードな無効化を実行します。

DB2_DDL_SOFT_INVAL レジストリー変数は、ALTER TABLE...DETACH PARTITION によって行われる無効化には影響しません。

ソフトな無効化のサポートは、動的 SQL と、カーソル固定 (CS) および非コミット読み取り (UR) 分離レベルのもとで行われるスキャンにのみ適用されます。 ALTER TABLE...DETACH PARTITION ステートメントについては、ソフトな無効化は、すべての分離レベルのもとで行われるスキャンに適用されます。

VIEW1 というビューがあるとします。 カーソルをオープンし、ステートメント SELECT * from VIEW1 を実行します。 その後すぐに、データベース管理者はコマンド DROP VIEW VIEW1 を発行して、VIEW1 をデータベースからドロップします。 ハードな無効化では、DROP VIEW ステートメントは SELECT トランザクションが完了するまで VIEW1 の排他ロックを待機せざるをえません。 ソフトな無効化の場合、DROP VIEW ステートメントでビューに排他ロックがかかりません。 ビューはドロップされますが、SELECT ステートメントはビューの最新の定義を使用して実行を続けます。 SELECT ステートメントが完了すると、後続のステートメントが VIEW1 の使用を試行してもエラー (SQL0204N) になります。直前まで VIEW1 を使用していた同じユーザーまたはプロセスによる後続ステートメントであっても同様です。