オブジェクトを変更するときのステートメント従属関係

ステートメントの従属関係には、パッケージ、 およびキャッシュに入った動的 SQL および XQuery ステートメントが含まれます。 パッケージ とは、データベース・オブジェクトの 1 つで、データベース・マネージャーが、特定のアプリケーション・プログラムにとって最も効率的な方法でデータにアクセスするのに必要な情報が入っています。 バインディング とは、データベース・マネージャーが、アプリケーションの実行時にデータベースにアクセスするのに必要なパッケージを作成するプロセスです。

パッケージおよびキャッシュに入った動的 SQL および XQuery ステートメントは、 さまざまなタイプのオブジェクトに従属することができます。

そうしたオブジェクトは、明示的に参照できます。 SQL SELECT ステートメントに含める表やユーザー定義関数などはその例です。 また、オブジェクトの暗黙的な参照も可能です。 例えば、親表の行の削除時に、参照制約 の違反がないかどうかの検査が必要な従属表がこれに該当します。 パッケージはさらに、パッケージ作成者に付与される特権にも依存しています。

パッケージまたはキャッシュ内の動的照会ステートメントがオブジェクトに依存している状態で、そのオブジェクトがドロップされると、そのパッケージまたはキャッシュ内の動的照会ステートメントは無効の状態になります。 パッケージがユーザー定義関数に依存している状態で、その関数がドロップされると、そのパッケージは以下の条件に基づいて作動不能の状態になります。
  • キャッシュに入れられた動的 SQL または XQuery ステートメント (無効状態) は再び、 次に使用する際に自動的に最適化されます。 ステートメントに必要なオブジェクトがドロップされている場合に動的 SQL または XQuery ステートメントを実行すると、失敗してエラー・メッセージが表示されることがあります。
  • 無効状態にあるパッケージは、次に使用する際に暗黙的に再バインドされます。 そのようなパッケージは明示的に再バインドすることもできます。 トリガーがドロップされたためにパッケージに無効のマークが付けられた場合、 再バインド・パッケージはトリガーを呼び出さなくなります。
  • 作動不能のパッケージは、明示的に再バインドした後でなければ使用できません。

フェデレーテッド・データベースのオブジェクトには、同様の従属関係があります。 例えば、サーバーをドロップしたりサーバー定義を変更したりすると、そのサーバーに関連付けられたニックネームを参照するパッケージ、またはキャッシュに入れられた動的 SQL は無効になります。

ある場合には、パッケージを再バインドできないことがあります。 例えば、表がドロップされたのに再作成されない場合は、パッケージを再バインドできません。 この場合、オブジェクトを再作成するか、ドロップされたオブジェクトをアプリケーションが使用しないようにアプリケーションを変更しなければなりません。

その他のほとんどの場合 (例えば制約 の 1 つがドロップされた場合) には、パッケージを再バインドすることが可能です。

以下のシステム・カタログ・ビューは、 パッケージの状態およびパッケージの従属関係を判別するのに役立ちます。
  • SYSCAT.PACKAGEAUTH
  • SYSCAT.PACKAGEDEP
  • SYSCAT.PACKAGES