DBMS_STREAMS_HANDLER_ADM
パッケージは、Oracle Streamsパッケージの1つであり、文DMLハンドラを管理するインタフェースを提供します。
この章では、次の項目について説明します。
概要
セキュリティ・モデル
ビュー
使用上の注意
この項では、DBMS_STREAMS_HANDLER_ADM
パッケージの使用に関連する項目について説明します。
文DMLハンドラは、適用プロセスでデキューされた行論理変更レコード(行LCR)に対して、1つ以上のデータ操作言語(DML)文を実行します。単一の文DMLハンドラに複数の文を含めることができ、それらの文の実行順序は制御できます。
文DMLハンドラは、適用プロセスのプロシージャDMLハンドラに類似しています。文DMLハンドラとプロシージャDMLハンドラはどちらも、行LCRにカプセル化されている行変更のカスタム処理を提供します。また、文DMLハンドラとプロシージャDMLハンドラはどちらも、適用プロセスが行LCRをデキューするときに実行されます。ただし、プロシージャDMLハンドラに対して、文DMLハンドラには次のような利点があります。
文DMLハンドラはPL/SQL処理を必要としないため、一般的に、プロシージャDMLハンドラよりもパフォーマンスが優れています。
文DMLハンドラの構文はDML構文と同じです。文DMLハンドラはPL/SQLプログラミングを必要としません。プロシージャDMLハンドラの場合は、PL/SQLプログラミングが必要です。
文DMLハンドラでは、行LCRの情報にアクセスするためにANYDATA
の値を操作する必要はありません。通常、プロシージャDMLハンドラではANYDATA
の値の操作が必要です。
文DMLハンドラは、同じデータベース・オブジェクトへの同じ操作に対して、エラー・ハンドラと共存できます。一方、同じデータベース・オブジェクトへの同じ操作に対して、プロシージャDMLハンドラとエラー・ハンドラの両方を指定することはできません。
注意: 同じデータベース・オブジェクトへの同じ操作に対して、複数の文DMLハンドラを指定できます。その場合、任意の順序で文DMLハンドラを実行でき、各文DMLハンドラは、適用プロセスでデキューされた元の行LCRのコピーを受け取ることができます。 |
関連項目: 『Oracle Streams概要および管理』 |
このパッケージのセキュリティは、次のいずれかの方法で制御できます。
選択したユーザーまたはロールに、このパッケージのEXECUTE
を付与する方法
選択したユーザーまたはロールに、EXECUTE_CATALOG_ROLE
を付与する方法
パッケージのサブプログラムをストアド・プロシージャ内から実行する場合、そのサブプログラムを実行するユーザーには、パッケージのEXECUTE
権限を直接付与する必要があります。ロールを通して付与することはできません。
このパッケージ内のサブプログラムを実行するユーザーが必要な権限を所有するには、Oracle Streams管理者を構成し、このパッケージを使用するときにOracle Streams管理者として接続します。
関連項目: Oracle Streams管理者の構成の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。 |
DBMS_STREAMS_HANDLER_ADM
パッケージは、『Oracle Databaseリファレンス』にリストされているビューを使用します。
DBA_APPLY_DML_HANDLERS
DBA_STREAMS_STMTS
DBA_STREAMS_STMT_HANDLERS
次の各項では、DBMS_STREAMS_HANDLER_ADM
パッケージの使用上の注意について説明します。
文DMLハンドラは、行論理変更レコード(行LCR)に対する任意の有効なDML操作に使用できます。たとえば、文DMLハンドラは表に加えられたDML変更を監査できます。
文DMLハンドラでは、次のSQL文がサポートされています。
INSERT
UPDATE
DELETE
MERGE
なお、文DMLハンドラのSQL文では定義変数をサポートしていません。
ただし、文DMLハンドラのSQL文には、行LCRタイプ(LCR$_ROW_RECORD
)に対するメンバー・サブプログラムのコールを含めることができます(ADD_COLUMN
、DELETE_COLUMN
、KEEP_COLUMNS
およびRENAME_COLUMN
など)。
注意: 文DMLハンドラは、行LCRの列の値を変更できません。 |
文DMLハンドラの文には、表148-1に示す、行LCRの列属性を含めることができます。
表148-1 行LCRの列属性
属性 | 説明 |
---|---|
|
行LCRの新しい列の値を戻します。新しい値が存在しない場合、この属性は古い値を戻します。 |
|
行LCRに新しい列の値が存在する場合は、 行LCRに新しい列の値が存在しない場合は、 |
|
行LCRの新しい列の値を戻します。新しい値が存在しない場合、この属性は |
|
行LCRの古い列の値を戻します。 |
|
行LCRに古い列の値が存在する場合は、 行LCRに古い列の値が存在しない場合は、 |
次の方法で文に属性を指定します。
:attribute.column_name
たとえば、salary
列に対してnew_only
属性を指定する場合は、文に次のように入力します。
:new_only.salary
文DMLハンドラの文には、表148-2に示す、行LCRの属性を含めることができます。
表148-2 行LCRの属性
属性 | 説明 |
---|---|
|
変更を行ったDML文のタイプ( |
|
LCRが属するトランザクションのコミットSCN(システム変更番号)を戻します。 |
|
LCRのサポートに最小限必要なデータベース互換性を戻します。 |
|
LCRにカプセル化されている変更を行ったデータベース・インスタンスのインスタンス番号を戻します。通常、インスタンス番号はOracle Real Application Clusters(Oracle RAC)構成で使用されます。 |
|
変更された行がある表を含むスキーマ名を戻します。 |
|
変更された行がある表の名前を戻します。 |
|
変更が行われた時点のSCNを戻します。 |
|
行の変更が発生したソース・データベースの名前を戻します。 |
|
取得プロセスで取得されたLCRの変更がソース・データベースのREDOログで生成された時刻、または永続LCRが作成された時刻を戻します。 |
|
LCRの追跡に使用可能なRAWタグを戻します。 |
|
DML文が実行されたトランザクションの識別子を戻します。 |
次の方法で文に属性を指定します。
:attribute_name
たとえば、行LCRにsource_database_name
属性を指定する場合は、文に次のように入力します。
:source_database_name
文DMLハンドラの文には、表148-3に示す、行LCRの追加属性を含めることができます。
表148-3 行LCRの追加属性
属性 | 説明 |
---|---|
|
行LCRで変更された行のROWIDを戻します。 |
|
LCRに取得された変更を実行したセッションのシリアル番号を戻します。 |
|
LCRに取得された変更を実行したセッションの識別子を戻します。 |
|
LCRに取得された変更が実行されたインスタンスのスレッド番号を戻します。通常、スレッド番号はOracle RAC構成でのみ使用されます。 |
|
LCRが属するトランザクションの名前を戻します。 |
|
LCRに取得された変更を実行した現行のユーザーの名前を戻します。 |
次の方法で文に属性を指定します。
:extra_attribute.attribute_name
たとえば、行LCRにrow_id
追加属性を指定する場合は、文に次のように入力します。
:extra_attribute.row_id
文DMLハンドラの文には、行LCRに対するEXECUTE
メンバー・プロシージャのコールを含めることができます。EXECUTE
メンバー・プロシージャは、現行ユーザーのセキュリティ・ドメイン下で行LCRを実行します。
EXECUTE
メンバー・プロシージャを実行する文は、文DMLハンドラの何番目の実行順序番号に配置することもできます。行LCRは、文DMLハンドラ内のその他のSQL文実行以外に、行LCRの変更を特定の表に適用する場合以外は実行する必要はありません。
文でEXECUTE
メンバー・プロシージャをコールする場合は、LCRの実行によって生じた競合の解消に対して、DBMS_APPLY_ADM
パッケージのSET_UPDATE_CONFLICT_HANDLER
プロシージャで表に定義した競合解消を使用するかどうかを、conflict_resolution
パラメータによって制御します。
:lcr.execute TRUE|FALSE
引数TRUE
は、競合解消を使用することを示します。引数FALSE
は、競合解消を使用しないことを示します。
たとえば、競合解消を使用するには、文に次のように入力します。
:lcr.execute TRUE
このパラメータが指定されていない場合またはNULL
に設定されている場合は、エラーが発生します。
関連項目:
|
表148-4 DBMS_STREAMS_HANDLER_ADMパッケージのサブプログラム
サブプログラム | 説明 |
---|---|
|
文DMLハンドラに文を追加します。 |
|
文DMLハンドラを作成します。 |
|
文DMLハンドラを削除します。 |
REMOVE_STMT_FROM_HANDLERプロシージャ |
文DMLハンドラから文を削除します。 |
注意: このパッケージのサブプログラムはコミットしません。 |
このプロシージャは、文DMLハンドラに文を追加します。
構文
DBMS_STREAMS_HANDLER_ADM.ADD_STMT_TO_HANDLER( handler_name IN VARCHAR2, statement IN CLOB, execution_sequence IN NUMBER DEFAULT NULL);
パラメータ
表148-5 ADD_STMT_TO_HANDLERプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
文DMLハンドラの名前。 |
|
文DMLハンドラに追加するSQL文のテキスト。
|
|
SQL文の実行順序を設定するための、文DMLハンドラにおける文の順位。文は、最も小さい実行順序番号から最も大きい実行順序番号へと実行されます。 正の整数、負の整数、小数を指定できます。また、0(ゼロ)を指定することもできます。 文DMLハンドラ内の既存の文で使用されている実行順序番号を指定すると、
|
このプロシージャは、文DMLハンドラを作成します。