35 表のDDL変更通知

この章では、表DDL変更通知を使用してデータベース表のDDL変更に関する通知を受信する方法について説明します。

トピック:

35.1 表のDDL変更通知の概要

表のDDL変更通知はOracle Call Interface (OCI)クライアントに、注目する表に関するDDL通知をサブスクライブするための効率的なメカニズムを提供します。表のDDL変更通知により、アプリケーションはDDL文で表に変更が加えられたときに通知を受信します。変更はDDLイベントとして取得され、そのようなイベントはユーザーによるDMLアクティビティをブロックすることなく非同期に処理されます。

表メタデータを検索するアプリケーションは、DDL変更について継続的にポーリングするかわりに表のDDL変更通知を使用できることから、ネットワーク・ラウンドトリップの削減という利益を得られます。表のDDL変更通知は、データベースへのラウンドトリップを回避するために、中間層に表メタデータをキャッシュするデータベースのOCIクライアントにも役立ちます。

OCIクライアントは、次のいずれかに関する表のDDL変更通知を受信するように登録できます。

  • 表のリスト

  • スキーマのリスト

  • データベース内のすべての表

Oracle Database 23ai以降のリリースには表のDDL変更通知が含まれています。

35.2 表のDDL変更通知の用語

OCIクライアント

OCIクライアント(クライアント、クライアント・アプリケーション)は、Oracle Call Interface (OCI)でAPIをコールするクライアント・プログラムです。

EMON

通知システムは、イベント・モニター(EMON)サーバー・プールを使用して、OCIクライアントに通知を発行します。

通知

通知は、OCIクライアントに送信される表のDDLイベントについて説明するメッセージです。通知にはDDL文全体は含まれていませんが、DDL操作の表名とタイプが示されます。

サブスクリプション

サブスクリプションでは、クライアントが特定の通知を受信するために使用できるチャネルを定義します。

イベント

イベントは、表に対するDDLアクションを説明するサブスクリプションで発行されたメッセージです。

登録

登録は、特定のサブスクリプション・トピックの通知が必要なクライアントを表します。

35.3 表のDDL変更通知の利点

表のDDL変更通知は、データベースのアプリケーション・アクティビティに影響することなく機能します。

次に、表のDDL変更通知を使用する利点の一部を示します。

  • 通知は高度にアクティブな表に対して有効にできます。

  • 登録とイベント処理によって、表に対するDDLアクティビティがブロックされることはありません。

  • 登録と通知は、DMLアクティビティのオーバーヘッドを最小限に抑えて、表カーソルを無効にすることなく処理されます。

  • 登録は、その他のクライアント・アプリケーションの同時登録を許可しながら迅速に処理されます。

  • クライアント・アプリケーションは、任意の数の追加の表またはスキーマに動的にサブスクライブできます。

35.4 表のDDL変更通知の機能

次に、表のDDL変更通知の機能を示します。

  • DDLイベントは、ユーザーによるDML問合せをブロックすることなく非同期に処理されます。

  • クライアント・アプリケーションは、デフォルトではイベント登録で使用できないパーティション・メンテナンス操作(PMOP)や切捨てなどのオプション・イベントを含めることもできます。

  • DDL通知は、システム・グローバル領域(SGA)にステージングされます。インスタンスが再起動すると、SGA内の未処理の通知は失われます。永続イベントはサポートされていません。

  • データベースのフェイルオーバー時に、SGA内の未配信イベントはすべて失われます。通知の損失による表メタデータの調整の問題を回避するために、フェイルオーバー時にはクライアント・キャッシュを無効にする必要があります。

  • ロジカル・スタンバイとフィジカル・スタンバイの場合、OCIクライアントは通知を再開するために新しいプライマリ・データベースに再度登録する必要があります。

35.5 表のDDL変更通知の使用

次に、表のDDL変更通知での通知プロセスの動作を示します。
  • クライアント・アプリケーションは、サブスクリプションの一部として表に対するDDLイベントに関する通知を受信するために登録します。

    関連項目:

    登録の詳細は、「表のDDL変更通知のための登録」を参照してください。

  • DDLイベントは、DDLトランザクションが表にコミットされるときに生成されます。

  • OCI EMONはDDLイベントを処理し、そのイベントをネイティブOCI形式(OCI_DTYPE_DDL_EVENT)でクライアント・アプリケーションに通知します。

    DDLイベントに含まれる情報は、次の項の「DDLイベント・ペイロード」を参照してください。

  • クライアント・アプリケーションはDDLイベントを受信して、そのイベントの処理のためにユーザー・コールバックを起動します。

    ユーザー・コールバック処理の詳細は、次の項の「DDL通知のためのクライアント・コールバックの登録」を参照してください。

DDLイベント・ペイロード

イベント・ペイロードには、クライアント・アプリケーションに通知するDDLイベントが記述されます。次に、イベントの属性を示します。

  • 操作タイプ: CREATEALTERDROPTRUNCATERENAMEまたはFLASHBACK

  • オブジェクト名: 実表の名前

  • オブジェクト型: DDLトランザクションの影響を受けるオブジェクト(例: パーティション、索引、表)

  • データベース名

  • SCN: DDLトランザクションのコミットSCN (データベース内のイベントを順序付けするため)。

  • UTCの変更時間: データベース間でのイベントの関連付けに役立ちます。

DDL通知のためのクライアント・コールバックの登録

  • クライアントは、ユーザー・コールバックの登録とイベント処理のために次のAPIを使用します。

    OCISubscriptionRegister(subhp): OCI_SUBSCR_CQ_QOS_DDL_NTFN DDL通知QoSおよびDBCHANGEネームスペースを使用。

  • これにより、クライアント・スレッドが開始され、イベントに対してユーザー・コールバックが非同期に起動されます。

  • サブスクリプションには、一意の(システム生成の)登録ID (regid)と、サブスクリプション名DDNF<regid>が割り当てられます。

関連項目:

ユーザー・コールバックAPIの詳細は、OCISubscriptionRegister()を参照してください。

ユースケース: GoldenGate Replicat

次に、Oracle GoldenGate Replicatをクライアントとするユースケースを示します。

Oracle GoldenGate Replicatは、論理レプリケーション時にターゲット・データベースでソースDMLとDDLの変更を適用します。アプリケーションのアップグレード時には、多くの場合、それに対応する変更をソース・データベースに加える前にターゲット表の構造が変更されます。このような場合は、ソース・データベースとターゲット・データベースの間でメタデータを同期および調整するためにはDDLレプリケーションを使用できません。

たとえば、ターゲット・データベースにFA1.AR_SALES_TAXというソース表をレプリケートするとします。Replicatは、SQL文INSERT into FA1.AR_SALES_TAX values(..)を再構築するために、FA1.AR_SALES_TAXのメタデータをロードします。関連するメタデータには、列の名前、列のタイプ、表が圧縮されているかどうかなどの情報が含まれます。表メタデータが変更されることはほとんどないため、Replicatはターゲット・データベースを繰り返し問い合せるかわりにデータをキャッシュします。表メタデータが初めてキャッシュされるときに、Replicatはターゲット・データベースのFA1.AR_SALES_TAXの表DDLイベントを登録します。

FA1.AR_SALES_TAX表がターゲット・データベースで直接変更されている(ソースでは変更されていない)シナリオについて考えてみます。たとえば、ソース・データベースに追加されていない新しい列がターゲット表に追加されたとします。Replicatには、表名と操作(たとえば、ALTER)が通知されます。Replicatは、適用する新しいトランザクションを受信すると、受信したDDLイベントに基づいて古いメタデータをリフレッシュして、新しく追加された列への挿入を正常にレプリケートできます。

35.6 表のDDL変更通知の登録

クライアントは、表レベルまたはスキーマ・レベル(スキーマ全体の表DDLイベントの場合)でDDL変更通知の登録ができます。

通知の登録には、次の条件を満たすことが必要です。

  • SYS以外のユーザーである必要があります。

  • SELECT ANY TABLE権限を持っている必要があります。

  • CHANGE NOTIFICATION権限を持っている必要があります。

  • OCI DDL通知クライアント接続のTCPまたはIPCリスナーを設定し、このリスナーにROOTコンテナのlocal_listenerパラメータを設定します。local_listenerパラメータは、初期化パラメータ・ファイル(init.ora)で設定することも、次のように設定することもできます:

    ALTER SYSTEM SET LOCAL_LISTENER=listener_name;
    ALTER SYSTEM REGISTER;

ノート:

ユーザーが必要な権限を失った場合、そのユーザーの表またはスキーマレベルの登録は暗黙的に登録解除されます。

35.6.1 表レベルの登録

表レベルでの通知の登録には、OCIDdlEventRegister()関数を使用します。

関連項目:

OCIDdlEventRegister()関数の詳細と例は、『Oracle Call Interfaceプログラマーズ・ガイド』の「OCIDdlEventRegister()」を参照してください。

次に、表レベルの通知の登録時に注意が必要な点を示します。

  • 任意の数の表に対する通知を受信するように登録できます。

  • 既存のサブスクリプションから動的に表を追加または削除できます。

  • 既存のサブスクリプションからの表の追加または削除は冪等操作です。

  • 表を削除または名前変更すると、その表は暗黙的に登録解除されます。

  • 既存の表のみを登録できます。

35.6.2 スキーマレベルの登録

スキーマ・レベルでの表DDL通知の登録には、OCIDdlEventRegister()関数を使用します。

関連項目:

OCIDdlEventRegister()関数の詳細と例は、『Oracle Call Interfaceプログラマーズ・ガイド』の「OCIDdlEventRegister()」を参照してください。

次に、スキーマレベルの通知の登録時に注意が必要な点を示します。

  • 任意の数のスキーマ名に対する通知を受信するように登録できます。

  • 既存のサブスクリプションから動的にスキーマを追加または削除できます。

  • 既存のサブスクリプションからのスキーマの追加または削除は冪等操作です。

  • スキーマを削除すると、そのスキーマは暗黙的に登録解除されます。

  • 既存のスキーマのみを登録できます。

35.7 表のDDL変更通知の登録解除

クライアントは、以前に登録した表またはスキーマの登録解除のためにOCIDdlEventUnregister()関数を使用できます。クライアントは、登録から削除する表とスキーマを選択できます。

表レベルまたはスキーマ・レベルでDDL通知を登録解除する場合は、OCIDdlEventUnregister()関数を使用します。

関連項目:

OCIDdlEventUnregister()関数の詳細と例は、『Oracle Call Interfaceプログラマーズ・ガイド』の「OCIDdlEventUnregister()」を参照してください。

次の場合は、自動的に表が登録解除されます。

  • 表またはスキーマが削除された。

  • クライアント・プロセスが登録解除なしに終了した。

  • 表の名前が変更された。

  • 通知を登録したユーザーが必要な権限(SELECT ANY TABLEまたはCHANGE NOTIFICATION)を失った。

クライアント・アプリケーションが登録解除なしで終了すると、通知の配信が失敗したときに未処理の通知が削除されます。OCIクライアントが再起動したら、通知を再開するために再登録が必要です。

35.8 サポートされているDDLイベントとコマンド

通常、表、パーティションまたは索引に対する領域管理の操作はサポートされていません。

サポートされているイベント

次のDDLイベントがDDL通知に含まれます。

  • ユーザー表およびグローバル一時表に対するイベント

  • AQキュー、ブロックチェーン表、マテリアライズド・ビューなどの特殊な表に対するイベント

  • 実表の索引や制約など、依存オブジェクトに影響するDDL文のイベント。

次のDDLイベントには、DDL通知の条件付きサポートがあります。

  • DDLにはフィルタを含めることができます。また、クライアントにはデフォルトでは配信されないPMOPやTRUNCATE操作などのオプション・イベントを含めることができます。

  • 外部キー更新やオンライン再定義などの複数表のDDL文については、通知に登録されている表のみがイベントを生成します。

次のDDLイベントはDDL通知から除外されます。

  • Oracle管理のスキーマ内の表とプライベート表または一時表に対するイベント

  • トリガーとパッケージに対するDDL文

  • スキーマの作成および削除のイベント

サポートされているコマンド

次のコマンドは、表レベルでサポートされています。

  • CREATE TABLE

  • DROP TABLE

  • TRUNCATE TABLE

  • RENAME TABLE

  • ALTER TABLE

次のコマンドは、PMOPレベルでサポートされています。

  • CREATE TABLE PARTITION [SUBPARTITION]
  • ALTER TABLE operation [PARTITION | SUBPARTITION]

    操作= [ ADD | DROP | MODIFY | EXCHANGE | MERGE | RENAME | SPLIT | TRUNCATE ]

次のコマンドは、制約レベルでサポートされています。

ALTER TABLE operation CONSTRAINT

操作= [ADD | MODIFY | RENAME | DROP]

次のコマンドは、フラッシュバック・レベルでサポートされています: FLASHBACK TABLE

次のコマンドは、索引レベルでサポートされています。

  • CREATE INDEX

  • ALTER INDEX

  • DROP INDEX

サポートされていないコマンド

次のコマンドは、表レベルではサポートされていません。

  • COMMENT

  • SHRINK SEGMENT

  • MOVE

PMOPレベルでは、MOVE操作がサポートされていません。

索引レベルでは、REBUILDCOALESCESPLIT PARTITIONなどの領域管理の操作はサポートされていません。

35.9 表のDDL変更通知の監視

登録識別子(ID)は、サブスクリプションを一意に識別します。クライアントは、同じサブスクリプション(つまり、登録ID)を使用して、データベースの複数の表やスキーマに登録できます。次のビューを登録IDで問い合せて、サブスクリプションに対して受信した表DDLイベントを監視できます。

  • すべての表、スキーマまたはデータベース・レベルの登録の詳細は、「DBA_DDL_REGS」を参照してください。

  • データベースで作成されたサブスクリプションの詳細は、「DBA_SUBSCR_REGISTRATIONS」を参照してください。

  • サブスクリプションに関する通知統計と診断情報については、V$SUBSCR_REGISTRATION_STATS (「V_SUBSCR_REGISTRATION_STATS」)を参照してください。