ヘッダーをスキップ
Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス
11g リリース1(11.1)
E05686-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

20 DBMS_APPLY_ADM

DBMS_APPLY_ADMパッケージは、一連のOracle Streamsパッケージの1つで、適用プロセスを開始、停止および構成するサブプログラムを提供しています。このパッケージには、適用ハンドラの構成、メッセージのエンキュー先の設定、メッセージの実行ディレクティブの指定を行うサブプログラムが含まれます。また、このパッケージは、接続先データベースのオブジェクトにインスタンス化SCNを設定する管理サブプログラムも提供します。さらには、適用エラーを管理するサブプログラムもあります。


関連項目:

このパッケージおよび適用プロセスの詳細は、『Oracle Streams概要および管理』および『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

この章では、次の項目について説明します。


DBMS_APPLY_ADMサブプログラムの要約

表20-1 DBMS_APPLY_ADMパッケージのサブプログラム

サブプログラム 説明

ALTER_APPLYプロシージャ


適用プロセスを変更します。

COMPARE_OLD_VALUESプロシージャ


適用時に、行論理変更レコード(行LCR)内に存在する1つ以上の列の元の値を、宛先サイトの対応する列の現在の値と比較するかどうかを指定します。

CREATE_APPLYプロシージャ


適用プロセスを作成します。

CREATE_OBJECT_DEPENDENCYプロシージャ


オブジェクトの依存性を作成します。

DELETE_ALL_ERRORSプロシージャ


指定した適用プロセスに対するすべてのエラー・トランザクションを削除します。

DELETE_ERRORプロシージャ


指定したエラー・トランザクションを削除します。

DROP_APPLYプロシージャ


適用プロセスを削除します。

DROP_OBJECT_DEPENDENCYプロシージャ


オブジェクトの依存性を削除します。

EXECUTE_ALL_ERRORSプロシージャ


指定した適用プロセスに対するエラー・トランザクションを再実行します。

EXECUTE_ERRORプロシージャ


指定したエラー・トランザクションを再実行します。

GET_ERROR_MESSAGEファンクション


指定したメッセージ番号とトランザクション識別子に対するメッセージ・ペイロードをエラー・キューから返します。

SET_DML_HANDLERプロシージャ


指定した適用プロセスを使用する指定オブジェクトに対する操作オプションを変更します。

SET_ENQUEUE_DESTINATIONプロシージャ


指定したルールを満たすメッセージが適用プロセスによって自動的にエンキューされるキューを設定します。

SET_EXECUTEプロシージャ


指定したルールを満たすメッセージを適用プロセスによって実行するかどうかを指定します。

SET_GLOBAL_INSTANTIATION_SCNプロシージャ


指定したソース・データベースに対して、およびオプションで、ソース・データベースのスキーマとそのスキーマが所有する表に対して、指定したインスタンス化SCNを記録します。

SET_KEY_COLUMNSプロシージャ


ローカル適用の目的で代替主キーとして使用される列セットを記録し、指定オブジェクトに対する既存の代替主キー列が存在する場合は、それを削除します。

SET_PARAMETERプロシージャ


適用パラメータを指定した値に設定します。

SET_SCHEMA_INSTANTIATION_SCNプロシージャ


指定したソース・データベース内の指定のスキーマに対して、およびオプションで、ソース・データベースのスキーマが所有する表に対して、指定したインスタンス化SCNを記録します。

SET_TABLE_INSTANTIATION_SCNプロシージャ


指定したソース・データベース内の指定表に対する指定インスタンス化SCNを記録します。

SET_UPDATE_CONFLICT_HANDLERプロシージャ


指定オブジェクトに対する更新競合ハンドラを追加、更新または削除します。

SET_VALUE_DEPENDENCYプロシージャ


値の依存性を設定または削除します。

START_APPLYプロシージャ


適用プロセスにメッセージの適用開始を指示します。

STOP_APPLYプロシージャ


適用プロセスを停止してメッセージの適用を中断し、適用が終了していないトランザクションをロールバックします。



注意:

特に指定がないかぎり、すべてのプロシージャがコミットされます。 ただし、GET_ERROR_MESSAGEファンクションはコミットされません。


ALTER_APPLYプロシージャ

このプロシージャでは、適用プロセスを変更します。

構文

  DBMS_APPLY_ADM.ALTER_APPLY(
     apply_name                IN  VARCHAR2,
     rule_set_name             IN  VARCHAR2  DEFAULT NULL,
     remove_rule_set           IN  BOOLEAN   DEFAULT FALSE,
     message_handler           IN  VARCHAR2  DEFAULT NULL
     remove_message_handler    IN  BOOLEAN   DEFAULT FALSE,
     ddl_handler               IN  VARCHAR2  DEFAULT NULL,
     remove_ddl_handler        IN  BOOLEAN   DEFAULT FALSE,
     apply_user                IN  VARCHAR2  DEFAULT NULL,
     apply_tag                 IN  RAW       DEFAULT NULL,
     remove_apply_tag          IN  BOOLEAN   DEFAULT FALSE,
     precommit_handler         IN  VARCHAR2  DEFAULT NULL,
     remove_precommit_handler  IN  BOOLEAN   DEFAULT FALSE,
     negative_rule_set_name    IN  VARCHAR2  DEFAULT NULL,
     remove_negative_rule_set  IN  BOOLEAN   DEFAULT FALSE);

パラメータ

表20-2 ALTER_APPLYプロシージャのパラメータ

パラメータ 説明

apply_name

変更する適用プロセスの名前。既存の適用プロセス名を指定する必要があります。所有者を指定しないでください。

rule_set_name

適用プロセスのポジティブ・ルール・セットの名前。ポジティブ・ルール・セットには、適用プロセスにメッセージの適用を指示するルールが含まれます。

適用プロセスに対してポジティブ・ルール・セットを使用する場合は、既存のルール・セットを[schema_name.]rule_set_nameの形式で指定する必要があります。たとえば、hrスキーマに含まれるjob_apply_rulesという名前のポジティブ・ルール・セットを指定するには、hr.job_apply_rulesと入力します。スキーマを指定しない場合は、現行のユーザー名がデフォルトで使用されます。

指定したルール・セットが存在しない場合は、エラーが戻されます。ルール・セットを作成し、そのルール・セットにルールを追加するには、DBMS_STREAMS_ADMパッケージまたはDBMS_RULE_ADMパッケージを使用します。

NULLを指定し、remove_rule_setパラメータをFALSEに設定すると、既存のすべてのポジティブ・ルール・セットが保持されます。 NULLを指定し、remove_rule_setパラメータをTRUEに設定すると、既存のすべてのポジティブ・ルール・セットが削除されます。

remove_rule_set

TRUEに設定すると、指定した適用プロセスに対するポジティブ・ルール・セットが削除されます。適用プロセスのポジティブ・ルール・セットを削除し、適用プロセスにネガティブ・ルール・セットがない場合、適用プロセスは、キュー内のすべてのメッセージをデキューします。

適用プロセスのポジティブ・ルール・セットを削除し、適用プロセスのネガティブ・ルール・セットが存在する場合、適用プロセスは、ネガティブ・ルール・セットによって廃棄されないキュー内のすべてのメッセージをデキューします。

FALSEに設定すると、指定した適用プロセスに対するポジティブ・ルール・セットが保持されます。

rule_set_nameパラメータがNULL以外の場合、このパラメータはFALSEに設定してください。

message_handler

適用プロセスに対する、キュー内の非LCRメッセージを処理するユーザー定義プロシージャ。

メッセージ・ハンドラ・プロシージャの詳細は、「CREATE_APPLYプロシージャ」「使用上の注意」を参照してください。

remove_message_handler

TRUEに設定すると、指定した適用プロセスに対するメッセージ・ハンドラが削除されます。

FALSEに設定すると、指定した適用プロセスに対するメッセージ・ハンドラは保持されます。

message_handler パラメータがNULL以外の場合、このパラメータはFALSEに設定してください。

ddl_handler

適用プロセスに対する、キュー内のDDL論理変更レコード(DDL LCR)を処理するユーザー定義プロシージャ。

適用されたDDL LCRはすべて自動的にコミットします。したがって、DDLハンドラが、DDL LCRのEXECUTEメンバー・プロシージャをコールすると、コミットが自動的に実行されます。

DDLハンドラ・プロシージャの詳細は、「CREATE_APPLYプロシージャ」「使用上の注意」を参照してください。

remove_ddl_handler

TRUEに設定すると、指定した適用プロセスに対するDDLハンドラが削除されます。

FALSEに設定すると、指定した適用プロセスに対するDDLハンドラは保持されます。

ddl_handlerパラメータがNULL以外の場合、このパラメータはFALSEに設定してください。

apply_user

ユーザーを指定します。このユーザーのセキュリティ・ドメイン内で、適用プロセスは、適用プロセスのルール・セットを満足するメッセージをデキューし、データベース・オブジェクトにメッセージを直接適用し、適用プロセス・ルールに対して構成されているカスタム・ルールベースの変換を実行し、適用プロセスに対して構成されている適用ハンドラを実行します。NULLの場合、適用ユーザーは変更されません。

NULL以外の値を指定して適用ユーザーを変更する場合は、ALTER_APPLYプロシージャを起動するユーザーにDBAロールが付与されている必要があります。apply_userSYSに設定できるのは、SYSユーザーに限られています。

適用ユーザーを変更すると、このプロシージャは、適用プロセスで使用されるキューのデキュー権限を新しい適用ユーザーに付与し、そのユーザーをキューの保護キュー・ユーザーとして構成します。

適用ユーザーには、このプロシージャによって付与される権限の他に、次の権限も付与する必要があります。

  • 適用オブジェクトのDML変更とDDL変更を実行する際に必要な権限

  • 適用プロセスで使用されるルール・セットのEXECUTE権限

  • ルール・セットで使用されるすべてのルールベース変換ファンクションのEXECUTE権限

  • すべての適用ハンドラ・プロシージャのEXECUTE権限

  • 適用プロセスによって実行されるサブプログラムで起動される、オラクル社が提供するパッケージを含むすべてのパッケージのEXECUTE権限

これらの権限は、適用ユーザーに直接付与する必要があります。ロールを通して付与することはできません。

デフォルトでは、このパラメータは、このパッケージのCREATE_APPLYプロシージャまたはDBMS_STREAMS_ADMパッケージのプロシージャを実行して適用プロセスを作成したユーザーに設定されます。

注意: 指定したユーザーがDROP USER... CASCADEを使用して削除されると、適用プロセスに対するapply_userは自動的にNULLに設定されます。適用プロセスを実行するには、適用ユーザーを指定する必要があります。

apply_tag

指定した適用プロセスによって生成されたREDOエントリに追加されるバイナリ・タグ。タグは、LCRの追跡に使用できるバイナリ値です。

タグは、適用プロセスを実行しているデータベースの取得プロセスが、適用プロセスによって加えられた変更を取得した場合にのみ関係します。この場合、取得した変更に、このパラメータで指定されたタグが含まれます。

NULL(デフォルト)の場合、適用プロセスに対する適用タグは変更されません。

次は、16進値17のタグの例です。

HEXTORAW('17')

関連項目: タグの詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

remove_apply_tag

TRUEに設定すると、指定した適用プロセスに対する適用タグにNULLが設定され、適用プロセスが生成したREDOエントリにNULLタグが付加されます。

FALSEに設定すると、指定した適用プロセスに対する適用タグは保持されます。

apply_tagパラメータがNULL以外の場合、このパラメータはFALSEに設定してください。

precommit_handler

適用プロセスのキュー内の内部コミット・ディレクティブを適用プロセスによって処理される前に受け取ることができるユーザー定義のプロシージャ。通常は、適用プロセスによって処理されるトランザクションのコミット情報を監査するために、プリコミット・ハンドラを使用します。

内部コミット・ディレクティブは、次のようにエンキューされます。

  • 取得プロセスで行LCRが取得されると、その取得プロセスによって、行LCRが含まれているトランザクションのコミット・ディレクティブがエンキューされます。

  • ユーザーまたはアプリケーションがメッセージをエンキューしてCOMMIT文を発行すると、コミット・ディレクティブが自動的にエンキューされます。

取得された行LCRの場合、コミット・ディレクティブにソース・データベースからのトランザクションのコミットSCNが含まれます。ユーザー・メッセージの場合、コミットSCNは適用プロセスによって生成されます。

プリコミット・ハンドラ・プロシージャでは、次の制限に従ってください。

  • コミットする作業を自律型トランザクションにする。

  • ロールバックには、プロシージャ内に作成した名前付きセーブポイントを指定する。

プリコミット・ハンドラで例外が発生した場合は、適用トランザクション全体がロールバックされ、トランザクション内のすべてのメッセージがエラー・キューに移動されます。

プリコミット・ハンドラ・プロシージャの詳細は、「CREATE_APPLYプロシージャ」「使用上の注意」を参照してください。

remove_precommit_handler

TRUEに設定すると、指定した適用プロセスに対するプリコミット・ハンドラが削除されます。

FALSEに設定すると、指定した適用プロセスに対するプリコミット・ハンドラが保持されます。

precommit_handlerパラメータがNULL以外の場合、このパラメータはFALSEに設定してください。

negative_rule_set_name

適用プロセスのネガティブ・ルール・セットの名前。ネガティブ・ルール・セットには、適用プロセスにメッセージの廃棄を指示するルールが含まれます。

適用プロセスに対してネガティブ・ルール・セットを使用する場合は、既存のルール・セットを[schema_name.]rule_set_nameの形式で指定する必要があります。たとえば、hrスキーマに含まれるneg_apply_rulesという名前のネガティブ・ルール・セットを指定するには、hr.neg_apply_rulesと入力します。スキーマを指定しない場合は、現行のユーザー名がデフォルトで使用されます。

指定したルール・セットが存在しない場合は、エラーが戻されます。ルール・セットを作成し、そのルール・セットにルールを追加するには、DBMS_STREAMS_ADMパッケージまたはDBMS_RULE_ADMパッケージを使用します。

NULLを指定し、remove_negative_rule_setパラメータをFALSEに設定すると、既存のすべてのネガティブ・ルール・セットが保持されます。NULLを指定し、remove_negative_rule_setパラメータをTRUEに設定すると、既存のすべてのネガティブ・ルール・セットが削除されます。

適用プロセスに対してポジティブ・ルール・セットとネガティブ・ルール・セットの両方を指定した場合は、ネガティブ・ルール・セットが常に最初に評価されます。

remove_negative_rule_set

TRUEに設定すると、指定した適用プロセスに対するネガティブ・ルール・セットが削除されます。適用プロセスのネガティブ・ルール・セットを削除し、適用プロセスにポジティブ・ルール・セットがない場合、適用プロセスは、キュー内のすべてのメッセージをデキューします。

適用プロセスのネガティブ・ルール・セットを削除し、適用プロセスのポジティブ・ルール・セットが存在する場合、適用プロセスは、ポジティブ・ルール・セットによって廃棄されないキュー内のすべてのメッセージをデキューします。

FALSEに設定すると、指定した適用プロセスに対するネガティブ・ルール・セットが保持されます。

negative_rule_set_nameパラメータがNULL以外の場合、このパラメータはFALSEに設定してください。


使用上の注意

適用プロセスは、次に示すALTER_APPLYプロシージャのパラメータ値を1つ以上変更すると、自動的に停止および再開します。


COMPARE_OLD_VALUESプロシージャ

このプロシージャでは、適用時に、行論理変更レコード(行LCR)内にある1つ以上の列の元の値を、宛先サイトの対応する列の現在の値と比較するかどうかを指定します。このプロシージャで実行するのは、UPDATEおよびDELETE関連の操作のみです。これらの操作によってのみ、行LCRに元の列値が入るためです。デフォルトでは、すべての列の元の値が比較されます。

このプロシージャはオーバーロードされています。column_listパラメータとcolumn_tableパラメータは、両方同時には指定できません。


関連項目:

Oracle Streams環境における競合の検出と解消の詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

構文

DBMS_APPLY_ADM.COMPARE_OLD_VALUES(
   object_name         IN VARCHAR2,
   column_list         IN VARCHAR2,
   operation           IN VARCHAR2 DEFAULT 'UPDATE',
   compare             IN BOOLEAN  DEFAULT TRUE,
   apply_database_link IN VARCHAR2 DEFAULT NULL);

DBMS_APPLY_ADM.COMPARE_OLD_VALUES(
   object_name         IN VARCHAR2,
   column_table        IN DBMS_UTILITY.LNAME_ARRAY,
   operation           IN VARCHAR2 DEFAULT 'UPDATE',
   compare             IN BOOLEAN  DEFAULT TRUE,
   apply_database_link IN VARCHAR2 DEFAULT NULL);

パラメータ

表20-3 COMPARE_OLD_VALUESプロシージャのパラメータ

パラメータ 説明

object_name

ソース表の名前。[schema_name.]object_nameの形式で指定します。たとえば、hr.employeesのように指定します。スキーマを指定しない場合は、現行のユーザー名がデフォルトで使用されます。

column_list

表内の列名のカンマ区切りリスト。エントリ間に空白を挿入しないでください。

すべての非キー列を指定する場合は、この値を*にします。

column_table

表内の列名が含まれているDBMS_UTILITY.LNAME_ARRAYタイプのPL/SQL索引付き表。最初の列名は位置1、2番目は位置2、以降同様に設定されている必要があります。表の最後をNULLにする必要はありません。

operation

操作名。次の操作名を指定できます。

  • UPDATE操作の場合はUPDATE

  • DELETE操作の場合はDELETE

  • UPDATE操作とDELETE操作の両方の場合は*

compare

TRUEの場合、指定した列の元の値が適用時に比較されます。FALSEの場合、指定した列の元の値は適用時に比較されません。

apply_database_link

Oracle以外のデータベースへのデータベース・リンクの名前。このパラメータは、接続先データベースがOracle以外のデータベースの場合にのみ設定する必要があります。


使用上の注意

デフォルトでは、適用プロセスは行LCRの元の列値を使用して競合を検出します。元の列値を比較しないようにすると、特定の表の競合を検出しないようにできます。たとえば、時刻列を使用して競合を検出する場合、非キー列および時刻以外の列については、適用プロセスによるチェックは必要ありません。


注意:

適用プロセスでは、行LCRにキー列の元の値が存在する場合、常に比較します。 column_listまたはcolumn_tableにキー列が指定されていてcompareパラメータがFALSEに設定されている場合は、エラーが発生します。


CREATE_APPLYプロシージャ

このプロシージャでは、適用プロセスを作成します。


注意:

このプロシージャを実行するユーザーには、DBAロールを付与する必要があります。

構文

  DBMS_APPLY_ADM.CREATE_APPLY(
     queue_name              IN  VARCHAR2,
     apply_name              IN  VARCHAR2,
     rule_set_name           IN  VARCHAR2  DEFAULT NULL,
     message_handler         IN  VARCHAR2  DEFAULT NULL,
     ddl_handler             IN  VARCHAR2  DEFAULT NULL,
     apply_user              IN  VARCHAR2  DEFAULT NULL,
     apply_database_link     IN  VARCHAR2  DEFAULT NULL,
     apply_tag               IN  RAW       DEFAULT '00',
     apply_captured          IN  BOOLEAN   DEFAULT FALSE,
     precommit_handler       IN  VARCHAR2  DEFAULT NULL,
     negative_rule_set_name  IN  VARCHAR2  DEFAULT NULL,
     source_database         IN  VARCHAR2  DEFAULT NULL);

パラメータ

表20-4 CREATE_APPLYプロシージャのパラメータ

パラメータ 説明

queue_name

適用プロセスがメッセージをデキューするキュー名。既存のキューを[schema_name.]queue_nameの形式で指定する必要があります。たとえば、hrスキーマ内のstreams_queueという名前のキューを指定するには、hr.streams_queueと入力します。スキーマを指定しない場合は、現行のユーザー名がデフォルトで使用されます。

注意: queue_nameの設定は、適用プロセスの作成後には変更できません。

apply_name

作成する適用プロセスの名前。NULL指定は許可されていません。所有者を指定しないでください。

また、既存の適用プロセス名やメッセージ・クライアント名と同じ名前を指定しないでください。

注意: apply_nameの設定は、適用プロセスの作成後には変更できません。

rule_set_name

適用プロセスのポジティブ・ルール・セットの名前。ポジティブ・ルール・セットには、適用プロセスにメッセージの適用を指示するルールが含まれます。

適用プロセスに対してポジティブ・ルール・セットを使用する場合は、既存のルール・セットを[schema_name.]rule_set_nameの形式で指定する必要があります。たとえば、hrスキーマに含まれるjob_apply_rulesという名前のポジティブ・ルール・セットを指定するには、hr.job_apply_rulesと入力します。スキーマを指定しない場合は、現行のユーザー名がデフォルトで使用されます。

NULLを指定し、ネガティブ・ルール・セットを指定しない場合、適用プロセスはapply_capturedパラメータの設定内容に応じて、永続キュー内に存在する、すべての取得済メッセージまたはすべてのメッセージを適用します。

指定したルール・セットが存在しない場合は、エラーが戻されます。ルール・セットを作成し、そのルール・セットにルールを追加するには、DBMS_STREAMS_ADMパッケージまたはDBMS_RULE_ADMパッケージを使用します。

message_handler

適用プロセスに対する、キュー内の非LCRメッセージを処理するユーザー定義プロシージャ。

メッセージ・ハンドラ・プロシージャの詳細は、「使用上の注意」を参照してください。

ddl_handler

適用プロセスに対する、キュー内のDDL論理変更レコード(DDL LCR)を処理するユーザー定義プロシージャ。

適用されたDDL LCRはすべて自動的にコミットします。したがって、DDLハンドラが、DDL LCRのEXECUTEメンバー・プロシージャをコールすると、コミットが自動的に実行されます。

DDLハンドラ・プロシージャの詳細は、「使用上の注意」を参照してください。

apply_user

適用プロセス・ルール・セットを満足するDML変更とDDL変更をすべて適用し、ユーザー定義の適用ハンドラを実行するユーザー。 NULLの場合は、CREATE_APPLYプロシージャの実行ユーザーが使用されます。

適用ユーザーを設定できるのは、DBAロールが付与されているユーザーのみです。apply_userSYSに設定できるのは、SYSユーザーに限られています。

適用ユーザーとは、そのユーザーのセキュリティ・ドメイン内で、適用プロセスが、適用プロセスのルール・セットを満足するメッセージをデキューし、データベース・オブジェクトにメッセージを直接適用し、適用プロセス・ルールに対して構成されているカスタム・ルールベースの変換を実行し、適用プロセスに対して構成されている適用ハンドラを実行するユーザーのことです。このユーザーには、変更を適用できる権限が必要です。このプロシージャでは、適用プロセスで使用されるキューのデキュー権限を適用ユーザーに付与し、そのユーザーをキューの保護キュー・ユーザーとして構成します。

適用ユーザーには、このプロシージャによって付与される権限の他に、次の権限も付与する必要があります。

  • 適用オブジェクトのDML変更とDDL変更を実行する際に必要な権限

  • 適用プロセスで使用されるルール・セットのEXECUTE権限

  • ルール・セットで使用されるすべてのルールベース変換ファンクションのEXECUTE権限

  • すべての適用ハンドラ・プロシージャのEXECUTE権限

  • 適用プロセスによって実行されるサブプログラムで起動される、オラクル社が提供するパッケージを含むすべてのパッケージのEXECUTE権限

これらの権限は、適用ユーザーに直接付与する必要があります。ロールを通して付与することはできません。

注意: 指定したユーザーがDROP USER... CASCADEを使用して削除されると、適用プロセスに対するapply_userは自動的にNULLに設定されます。.適用プロセスを実行するには、適用ユーザーを指定する必要があります。

apply_database_link

適用プロセスがメッセージを適用するデータベース。このパラメータは、Oracleからオラクル以外のシステム(例: Sybase)に変更を適用するときに使用されます。ローカル・データベースでメッセージを適用するように指定するには、このパラメータをNULLに設定します。

注意: apply_database_linkの設定は、適用プロセスの作成後には変更できません。

apply_tag

指定した適用プロセスによって生成されたREDOエントリに追加されるバイナリ・タグ。タグは、LCRの追跡に使用できるバイナリ値です。

タグは、適用プロセスを実行しているデータベースの取得プロセスが、適用プロセスによって加えられた変更を取得した場合にのみ関係します。この場合、取得した変更に、このパラメータで指定されたタグが含まれます。

デフォルトでは、適用プロセスに対するタグは、'00'(ダブル・ゼロ)に相当する16進値です。

次は、16進値17のタグの例です。

HEXTORAW('17')

NULLに設定すると、適用プロセスはNULLタグを付加してREDOエントリを生成します。

関連項目: タグの詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

apply_captured

TRUEまたはFALSE

TRUEに設定すると、適用プロセスはキュー内に存在する取得済LCRのみを適用します。取得済LCRは、Oracle Streams取得プロセスで取得されたLCRです。

FALSEに設定すると、適用プロセスは永続キュー内に存在するメッセージのみを適用します。これらは、Oracle Streams取得プロセスによって取得されなかった永続LCRやユーザー・メッセージなどのメッセージです。

永続キュー内に存在する、取得されたLCRとメッセージの両方を適用するには、2つ以上の適用プロセスを作成する必要があります。

注意: apply_capturedの設定は、適用プロセスの作成後には変更できません。

関連項目: メッセージを適用プロセスで処理する方法の詳細は、『Oracle Streams概要および管理』を参照してください。

precommit_handler

適用プロセスのキュー内の内部コミット・ディレクティブを適用プロセスによって処理される前に受け取ることができるユーザー定義のプロシージャ。通常は、適用プロセスによって処理されるトランザクションのコミット情報を監査するために、プリコミット・ハンドラを使用します。

内部コミット・ディレクティブは、次のようにエンキューされます。

  • 取得プロセスで行LCRが取得されると、その取得プロセスによって、行LCRが含まれているトランザクションのコミット・ディレクティブがエンキューされます。

  • 同期取得で行LCRが取得されると、同期取得でエンキューされた永続LCRはメッセージ・グループに編成されます。同期取得は、トランザクション内の各永続LCRにトランザクション識別子を記録します。

  • ユーザーまたはアプリケーションがメッセージをエンキューしてCOMMIT文を発行すると、コミット・ディレクティブが自動的にエンキューされます。

取得プロセスまたは同期取得によって取得された行LCRの場合、コミット・ディレクティブにソース・データベースからのトランザクションのコミットSCNが含まれます。ユーザーまたはアプリケーションによってエンキューされたメッセージの場合、コミットSCNは適用プロセスによって生成されます。

プリコミット・ハンドラ・プロシージャでは、次の制限に従ってください。

  • コミットする作業を自律型トランザクションにする。

  • ロールバックには、プロシージャ内に作成した名前付きセーブポイントを指定する。

プリコミット・ハンドラで例外が発生した場合は、適用トランザクション全体がロールバックされ、トランザクション内のすべてのメッセージがエラー・キューに移動されます。

プリコミット・ハンドラ・プロシージャの詳細は、「使用上の注意」を参照してください。

negative_rule_set_name

適用プロセスのネガティブ・ルール・セットの名前。ネガティブ・ルール・セットには、適用プロセスにメッセージの廃棄を指示するルールが含まれます。

適用プロセスに対してネガティブ・ルール・セットを使用する場合は、既存のルール・セットを[schema_name.]rule_set_nameの形式で指定する必要があります。たとえば、hrスキーマに含まれるneg_apply_rulesという名前のネガティブ・ルール・セットを指定するには、hr.neg_apply_rulesと入力します。スキーマを指定しない場合は、現行のユーザー名がデフォルトで使用されます。

NULLを指定し、ポジティブ・ルール・セットを指定しない場合、適用プロセスはapply_capturedパラメータの設定内容に応じて、永続キュー内に存在する、すべての取得済LCRまたはすべてのメッセージを適用します。

指定したルール・セットが存在しない場合は、エラーが戻されます。ルール・セットを作成し、そのルール・セットにルールを追加するには、DBMS_STREAMS_ADMパッケージまたはDBMS_RULE_ADMパッケージを使用します。

適用プロセスに対してポジティブ・ルール・セットとネガティブ・ルール・セットの両方を指定した場合は、ネガティブ・ルール・セットが常に最初に評価されます。

source_database

適用プロセスによって適用される変更のソース・データベースのグローバル名。ソース・データベースは、変更が発生したデータベースです。取得メッセージを適用する場合、適用プロセスによって適用できるのは、1つのソース・データベースでの1つの取得プロセスによるメッセージのみです。

NULLの場合、適用プロセスが受け取る最初のLCRのソース・データベース名がソース・データベースに使用されます。

ドメイン名を指定しない場合は、自動的にドメイン名がデータベース名に追加されます。たとえば、ドメイン名が.NETの場合にDBS1を指定すると、自動的にDBS1.NETが指定されます。

適用プロセス・ルール・セットのルールによって、適用プロセスがデキューするメッセージが決まります。適用プロセスのソース・データベースとは異なるソース・データベースで、適用プロセスによるLCRのデキューを行うと、エラーが発生します。適用プロセスのソース・データベースを特定する場合は、DBA_APPLY_PROGRESSデータ・ディクショナリ・ビューへの問合せを行います。


使用上の注意

次の各項では、このプロシージャの使用上の注意について説明します。

ハンドラ・プロシージャの名前

message_handlerddl_handlerおよびprecommit_handlerパラメータの場合は、既存のプロシージャを次のいずれかの形式で指定します。

プロシージャがパッケージ内にある場合は、package_nameを指定する必要があります。 たとえば、hrスキーマ内のapply_pkgパッケージにあるprocess_ddlsという名前のプロシージャを指定するには、hr.apply_pkg.process_ddlsと入力します。指定したプロシージャが存在しない場合はエラーが戻されます。

CREATE_APPLYプロシージャを起動するユーザーには、指定したハンドラ・プロシージャのEXECUTE権限が必要です。 また、schema_nameを指定しない場合は、CREATE_APPLYプロシージャの起動ユーザー名がデフォルトで使用されます。

メッセージ・ハンドラおよびDDLハンドラのプロシージャ

message_handlerパラメータおよびddl_handlerパラメータの両方に指定されたプロシージャには、次の署名が必要です。

PROCEDURE handler_procedure (
   parameter_name  IN  ANYDATA);

handler_procedureはプロシージャ名、parameter_nameはプロシージャに渡されるパラメータ名を表します。メッセージ・ハンドラの場合、プロシージャに渡されるパラメータは、ユーザー・メッセージをANYDATAにカプセル化したものです。DDLハンドラの場合は、DDL LCRをANYDATAにカプセル化したものです。


関連項目:

DDL LCRの詳細は、第228章「論理変更レコードのタイプ」を参照してください。

プリコミット・ハンドラ・プロシージャ

precommit_handlerパラメータに指定するプロシージャには、次の署名が必要です。

PROCEDURE handler_procedure (
   parameter_name   IN  NUMBER);

handler_procedureはプロシージャ名、parameter_nameはプロシージャに渡されるパラメータ名を表します。プロシージャに渡すパラメータは、コミット・ディレクティブのコミットSCNです。


CREATE_OBJECT_DEPENDENCYプロシージャ

このプロシージャでは、オブジェクトの依存性を作成します。オブジェクトの依存性とは、接続先データベースにある2つのオブジェクト間の親子関係を規定する仮想的な依存性の定義です。

適用プロセスでは、親オブジェクトが含まれている、コミット・システム変更番号(コミットSCN)が小さいすべてのトランザクションがコミットされた後に、子オブジェクトが含まれているトランザクションが実行されるようにスケジュールされます。適用プロセスでは、依存性の検出に、論理変更レコード(LCR)内のオブジェクトのオブジェクト識別子が使用されます。依存性の検出に、LCRの列値は使用されません。


注意:

このプロシージャのいずれかのパラメータに対してNULLを指定すると、エラーが発生します。


関連項目:


構文

  DBMS_APPLY_ADM.CREATE_OBJECT_DEPENDENCY(
     object_name         IN  VARCHAR2,
     parent_object_name  IN  VARCHAR2);

パラメータ

表20-5 CREATE_OBJECT_DEPENDENCYプロシージャのパラメータ

パラメータ 説明

object_name

子データベース・オブジェクトの名前。[schema_name.]object_nameの形式で指定します。たとえば、hr.employeesのように指定します。スキーマを指定しない場合は、現行のユーザー名がデフォルトで使用されます。

parent_object_name

親データベース・オブジェクトの名前。[schema_name.]object_nameの形式で指定します。たとえば、hr.departmentsのように指定します。スキーマを指定しない場合は、現行のユーザー名がデフォルトで使用されます。



DELETE_ALL_ERRORSプロシージャ

このプロシージャでは、指定した適用プロセスに対するすべてのエラー・トランザクションを削除します。

構文

DBMS_APPLY_ADM.DELETE_ALL_ERRORS(
   apply_name  IN  VARCHAR2 DEFAULT NULL);

パラメータ

表20-6 DELETE_ALL_ERRORSプロシージャのパラメータ

パラメータ 説明

apply_name

トランザクション処理時にエラーが発生した適用プロセスの名前。所有者を指定しないでください。

NULLの場合は、すべての適用プロセスに対するすべてのエラー・トランザクションが削除されます。



DELETE_ERRORプロシージャ

このプロシージャでは、指定したエラー・トランザクションを削除します。

構文

DBMS_APPLY_ADM.DELETE_ERROR(
   local_transaction_id  IN  VARCHAR2);

パラメータ

表20-7 DELETE_ERRORプロシージャのパラメータ

パラメータ 説明

local_transaction_id

削除するエラー・トランザクションの識別番号。指定したトランザクションがエラー・キューに存在しない場合は、エラーが発生します。



DROP_APPLYプロシージャ

このプロシージャでは、適用プロセスを削除します。

構文

  DBMS_APPLY_ADM.DROP_APPLY(
     apply_name             IN  VARCHAR2,
     drop_unused_rule_sets  IN  BOOLEAN  DEFAULT FALSE);

パラメータ

表20-8 DROP_APPLYプロシージャのパラメータ

パラメータ 説明

apply_name

削除する適用プロセスの名前。既存の適用プロセス名を指定する必要があります。所有者を指定しないでください。

drop_unused_rule_sets

TRUEに設定すると、指定した適用プロセスで使用されるポジティブ・ルール・セットおよびネガティブ・ルール・セットが、他のOracle Streamsクライアントによって使用されない場合に削除されます。Oracle Streamsクライアントには、取得プロセス、伝播、適用プロセス、メッセージ・クライアントがあります。このプロシージャによってルール・セットが削除される場合は、そのルール・セット内のルールのうち、別のルール・セット内に存在しないルールも同時に削除されます。

FALSEに設定すると、指定した適用プロセスで使用されるルール・セットは削除されず、ルール・セットにルールが保持されます。


使用上の注意

このプロシージャを使用して適用プロセスを削除すると、その適用プロセスに対してDBMS_STREAMS_ADMパッケージを使用して作成したルールに関する情報は、Oracle Streamsルールのデータ・ディクショナリ・ビューから削除されます。このルールに関する情報は、このルールが適用プロセスのポジティブ・ルール・セットとネガティブ・ルール・セットのいずれにも含まれていない場合でも削除されます。Oracle Streamsルールのデータ・ディクショナリ・ビューは次のとおりです。


DROP_OBJECT_DEPENDENCYプロシージャ

このプロシージャでは、オブジェクトの依存性を削除します。オブジェクトの依存性とは、接続先データベースにある2つのオブジェクト間の親子関係を規定する仮想的な依存性の定義です。


注意:

  • 指定したデータベース・オブジェクトに、オブジェクトの依存性が存在しない場合は、エラーが発生します。

  • このプロシージャのいずれかのパラメータに対してNULLを指定すると、エラーが発生します。



関連項目:


構文

  DBMS_APPLY_ADM.DROP_OBJECT_DEPENDENCY(
     object_name         IN  VARCHAR2,
     parent_object_name  IN  VARCHAR2);

パラメータ

表20-9 DROP_OBJECT_DEPENDENCYプロシージャのパラメータ

パラメータ 説明

object_name

子データベース・オブジェクトの名前。[schema_name.]object_nameの形式で指定します。たとえば、hr.employeesのように指定します。スキーマを指定しない場合は、現行のユーザー名がデフォルトで使用されます。

parent_object_name

親データベース・オブジェクトの名前。[schema_name.]object_nameの形式で指定します。たとえば、hr.departmentsのように指定します。スキーマを指定しない場合は、現行のユーザー名がデフォルトで使用されます。



EXECUTE_ALL_ERRORSプロシージャ

このプロシージャでは、指定した適用プロセスのエラー・キュー内のエラー・トランザクションを再実行します。

トランザクションは、コミットSCN順に再実行されます。エラーが発生すると、エラーの再実行を停止します。


関連項目:

エラー・キューの詳細は、『Oracle Streams概要および管理』を参照してください。

構文

DBMS_APPLY_ADM.EXECUTE_ALL_ERRORS(
   apply_name       IN  VARCHAR2  DEFAULT NULL,
   execute_as_user  IN  BOOLEAN   DEFAULT FALSE);

パラメータ

表20-10 EXECUTE_ALL_ERRORSプロシージャのパラメータ

パラメータ 説明

apply_name

トランザクション処理時にエラーが発生した適用プロセスの名前。所有者を指定しないでください。

NULLの場合は、すべての適用プロセスに対するすべてのエラー・トランザクションが再実行されます。

execute_as_user

TRUEに設定すると、現行のユーザーのセキュリティ・コンテキスト内でトランザクションが再実行されます。

FALSEに設定すると、トランザクションの元の受信者のセキュリティ・コンテキスト内で各トランザクションが再実行されます。元の受信者とは、エラー発生時にトランザクションを処理していたユーザーです。DBA_APPLY_ERRORデータ・ディクショナリ・ビューに、各エラー・トランザクションに対する元の受信者がリストされます。

トランザクションを実行するユーザーには、適用オブジェクトに対してDML変更とDDL変更を実行する権限、および適用ハンドラを実行する権限が必要です。また、適用プロセスで使用されるキューに対するデキュー権限も必要です。



EXECUTE_ERRORプロシージャ

このプロシージャでは、エラー・キュー内の指定したエラー・トランザクションを再実行します。


関連項目:

エラー・キューの詳細は、『Oracle Streams概要および管理』を参照してください。

構文

DBMS_APPLY_ADM.EXECUTE_ERROR(
   local_transaction_id  IN  VARCHAR2,
   execute_as_user       IN  BOOLEAN   DEFAULT FALSE,
   user_procedure        IN  VARCHAR2  DEFAULT NULL);

パラメータ

表20-11 EXECUTE_ERRORプロシージャのパラメータ

パラメータ 説明

local_transaction_id

実行するエラー・トランザクションの識別番号。指定したトランザクションがエラー・キューに存在しない場合は、エラーが発生します。

execute_as_user

TRUEに設定すると、現行のユーザーのセキュリティ・コンテキスト内でトランザクションが再実行されます。

FALSEに設定すると、トランザクションの元の受信者のセキュリティ・コンテキスト内でトランザクションが再実行されます。元の受信者とは、エラー発生時にトランザクションを処理していたユーザーです。DBA_APPLY_ERRORデータ・ディクショナリ・ビューに、各エラー・トランザクションに対する元の受信者がリストされます。

トランザクションを実行するユーザーには、適用オブジェクトに対してDML変更とDDL変更を実行する権限、および適用ハンドラを実行する権限が必要です。また、適用プロセスで使用されるキューに対するデキュー権限も必要です。

user_procedure

エラー・トランザクションを正しく実行できるように変更するユーザー定義プロシージャ。

NULLを指定すると、ユーザー・プロシージャを実行せずに、エラー・トランザクションが実行されます。

関連項目: ユーザー・プロシージャの詳細は、「使用上の注意」を参照してください。


使用上の注意

user_procedureパラメータには、完全なプロシージャ名を次のいずれかの形式で指定する必要があります。

プロシージャがパッケージ内にある場合は、package_nameを指定する必要があります。 EXECUTE_ERRORプロシージャを起動するユーザーには、指定したプロシージャのEXECUTE権限が必要です。 またschema_nameを指定しない場合は、EXECUTE_ERRORプロシージャを起動するユーザーの名前がデフォルトで使用されます。

たとえば、procedure_nameのプロパティが次のとおりであるとします。

この場合、次のように指定します。

strmadmin.fix_errors.fix_hr_errors

エラー処理用に作成するプロシージャには、次の署名が必要です。

PROCEDURE user_procedure (
     in_anydata                    IN      ANYDATA,
     error_record                  IN      DBA_APPLY_ERROR%ROWTYPE,
     error_message_number          IN      NUMBER,
     messaging_default_processing  IN OUT  BOOLEAN,
     out_anydata                   OUT     ANYDATA);

ユーザー・プロシージャには、次のパラメータがあります。

LCRをユーザー・プロシージャ内のEXECUTE LCRメンバー・プロシージャを使用して実行すると、このLCRは直接実行されるため、messaging_default_processingパラメータをFALSEに設定する必要があります。この場合、LCRは適用ハンドラに渡されません。

ユーザー・プロシージャでエラー・トランザクションを処理すると、次のいずれかの結果になります。

ユーザー・プロシージャには、次の制限事項が適用されます。


注意:

COMMITROLLBACKなどのトランザクション・ディレクティブが含まれているLCRは、ユーザー・プロシージャに渡されません。


GET_ERROR_MESSAGEファンクション

このファンクションでは、指定したメッセージ番号とトランザクション識別子に対するメッセージ・ペイロードをエラー・キューから返します。メッセージは、LCR(論理変更レコード)メッセージまたは非LCRメッセージになります。

このファンクションはオーバーロードされています。このファンクションには、2つのOUTパラメータを持つバージョンがあります。その場合、2つのOUTパラメータには、メッセージをエンキューする宛先キューが存在していればそのキューを指定し、メッセージを実行するかどうかを指定します。 宛先キューを指定する場合はSET_ENQUEUE_DESTINATIONプロシージャ、実行ディレクティブを指定する場合はSET_EXECUTEプロシージャを使用します。

構文

DBMS_APPLY_ADM.GET_ERROR_MESSAGE(
   message_number          IN   NUMBER,
   local_transaction_id    IN   VARCHAR2,
   destination_queue_name  OUT  VARCHAR2,
   execute                 OUT  BOOLEAN)
RETURN ANYDATA;

DBMS_APPLY_ADM.GET_ERROR_MESSAGE(
   message_number          IN   NUMBER,
   local_transaction_id    IN   VARCHAR2)
RETURN ANYDATA;

パラメータ

表20-12 GET_ERROR_MESSAGEファンクションのパラメータ

パラメータ 説明

message_number

メッセージの識別番号。この番号によって、トランザクション内のメッセージの位置が識別されます。 DBA_APPLY_ERRORデータ・ディクショナリ・ビューを問い合せて、各適用エラーのメッセージ番号を表示します。

local_transaction_id

メッセージを返すエラー・トランザクションの識別子。

destination_queue_name

メッセージをエンキューするキュー名を指定します。メッセージをキューにエンキューしない場合は、NULLを指定します。

execute

メッセージを実行する場合は、TRUEを指定します。

メッセージを実行しない場合は、FALSEを指定します。



SET_DML_HANDLERプロシージャ

このプロシージャでは、指定オブジェクトでの指定操作に対するDMLハンドラとしてユーザー・プロシージャを設定します。ユーザー・プロシージャは、指定オブジェクトでの指定操作に対する適用動作を変更します。

構文

DBMS_APPLY_ADM.SET_DML_HANDLER(
   object_name          IN  VARCHAR2,
   object_type          IN  VARCHAR2,
   operation_name       IN  VARCHAR2,
   error_handler        IN  BOOLEAN   DEFAULT FALSE,
   user_procedure       IN  VARCHAR2,
   apply_database_link  IN  VARCHAR2  DEFAULT NULL,
   apply_name           IN  VARCHAR2  DEFAULT NULL,
   assemble_lobs        IN  BOOLEAN   DEFAULT FALSE);

パラメータ

表20-13 SET_DML_HANDLERプロシージャのパラメータ

パラメータ 説明

object_name

ソース・オブジェクトの名前。[schema_name.]object_nameの形式で指定します。たとえば、hr.employeesのように指定します。スキーマを指定しない場合は、現行のユーザー名がデフォルトで使用されます。指定するオブジェクトは、このプロシージャの実行時に存在している必要はありません。

object_type

ソース・オブジェクトのタイプ。現在、指定できるソース・オブジェクトのタイプはTABLEのみです。

operation_name

操作名。次の操作名を指定できます。

  • INSERT

  • UPDATE

  • DELETE

  • LOB_UPDATE

  • DEFAULT

たとえば、hr.employees表に対してこのプロシージャを2回実行するとします。 1回目のコールで、operation_nameUPDATEuser_procedureemployees_updateに設定します。 2回目のコールでは、operation_nameINSERTuser_procedureemployees_insertに設定します。 両方とも、error_handlerFALSEに設定します。 この場合、hr.employees表のUPDATE操作に対してemployees_updateプロシージャが実行され、hr.employees表のINSERT操作に対してはemployees_insertプロシージャが実行されます。

このプロシージャをデータベース・オブジェクトのデフォルトのDMLハンドラとして設定するには、DEFAULTを指定します。 これにより、データベース・オブジェクトでの操作用に別のDMLハンドラが設定されていない場合は、このデフォルトのDMLハンドラがデータベース・オブジェクトのINSERTUPDATEDELETEおよびLOB_WRITEに対して使用されます。

error_handler

TRUEに設定すると、指定オブジェクトでの指定操作に関連する行変更レコード(行LCR)で適用プロセス・エラーが発生したときに、指定したユーザー・プロシージャが実行されます。このユーザー・プロシージャは、潜在的なエラー条件の解決、管理者へのエラー通知またはエラーのログ記録を実行するようにコード化できます。また、これらの処理を組み合せて実行するようにコード化することもできます。

FALSEに設定すると、指定オブジェクトでの指定操作に関連するすべての行LCRに対して、設定されるハンドラが実行されます。

user_procedure

指定オブジェクトでの指定操作に対する適用時に起動されるユーザー定義プロシージャ。プロシージャがDMLハンドラの場合は、Oracleで実行されるデフォルト適用のかわりに起動されます。プロシージャがエラー・ハンドラの場合は、適用プロセスでエラーが発生したときに起動されます。

指定オブジェクトでの指定操作で起動されるDMLハンドラを設定解除する場合は、NULLを指定します。

apply_database_link

Oracle以外のデータベースへのデータベース・リンクの名前。このパラメータは、接続先データベースがOracle以外のデータベースの場合にのみ設定する必要があります。

apply_name

DMLハンドラまたはエラー・ハンドラを使用する適用プロセスの名前。

NULLを指定すると、データベース内のすべての適用プロセスに対する汎用ハンドラとして、DMLハンドラまたはエラー・ハンドラが設定されます。

user_procedureパラメータにNULLを指定してハンドラの設定を解除するときに、設定解除するハンドラが特定の適用プロセスに対して設定されている場合は、apply_nameパラメータを使用して、ハンドラの設定を解除する適用プロセスを指定します。

assemble_lobs

TRUEに設定すると、ハンドラで処理される、LCR内のLOB列に対してLOBアセンブリが使用されます。LOBアセンブリは、1つの行変更によって生成されたLOB列の複数のLCRを、1つの行LCRにまとめてハンドラに渡します。 LOBアセンブリを使用するには、データベース互換性が10.2.0以上である必要があります。

FALSEに設定すると、ハンドラで処理される、LCR内のLOB列に対してLOBアセンブリは使用されません。


使用上の注意

このプロシージャは、接続先データベースで実行します。 SET_DML_HANDLERプロシージャは、カスタマイズされた適用を使用して、DML変更(行LCR)が含まれる論理変更レコードを適用する方法をユーザーに提供します。

error_handlerパラメータをTRUEに設定すると、ユーザー・プロシージャがエラー・ハンドラとして指定されます。エラー・ハンドラは、行LCRで適用プロセス・エラーが発生したときに起動されます。このようなエラーは、競合ハンドラが指定されていないか、または更新競合ハンドラで競合を解消できない場合に、データ競合が原因で発生する可能性があります。 error_handlerパラメータをFALSEに設定すると、ユーザー・プロシージャはエラー・ハンドラではなくDMLハンドラとして指定され、指定オブジェクトで指定操作を実行するかわりに、DMLハンドラが常に実行されます。

このプロシージャは、オブジェクトでの特定操作に対して、DMLハンドラまたはエラー・ハンドラのいずれかを設定します。同じオブジェクトと操作に対してDMLハンドラとエラー・ハンドラの両方は設定できません。

apply_nameパラメータがNULL以外の場合は、指定した適用プロセスにDMLハンドラまたはエラー・ハンドラが設定されます。この場合、設定されたハンドラは、ローカルの接続先データベースで他の適用プロセスに対して起動されません。 apply_nameパラメータがNULL(デフォルト)の場合は、接続先データベースのすべての適用プロセスに対する汎用ハンドラとして、ハンドラが設定されます。特定の適用プロセスに対して設定された場合のハンドラは、すべての汎用ハンドラに優先します。たとえば、次の状況を想定します。

この場合、apply_hr適用プロセスは、hr.employees表のUPDATE操作にhandler_hr DMLハンドラを使用します。

ソース・データベースでは、DMLハンドラまたはエラー・ハンドラで必要な列に対して、絶対的な補助ログ・グループを指定する必要があります。


注意:

DMLハンドラ、エラー・ハンドラおよびカスタム・ルールベースの変換ファンクションで、LCR内のLONG列、LONG RAW列およびアセンブルされていないLOB列のデータを変更しないでください。LOBアセンブリによって作成された行LCR内のLOB列は、DMLハンドラおよびエラー・ハンドラで変更できます。


注意:

現在、Oracle以外のデータベースに変更を適用している適用プロセスに対するエラー・ハンドラの設定はサポートされていません。

SET_DML_HANDLERプロシージャを使用すると、指定オブジェクトで指定操作を実行する行LCRに対して、DMLハンドラまたはエラー・ハンドラのいずれかを設定できます。次の項では、DMLハンドラ・プロシージャの署名およびエラー・ハンドラ・プロシージャの署名について説明します。

どちらの場合も、次のいずれかの形式でuser_procedureパラメータに完全なプロシージャ名を指定する必要があります。

プロシージャがパッケージ内にある場合は、package_nameを指定する必要があります。 SET_DML_HANDLERプロシージャを起動するユーザーには、指定したプロシージャのEXECUTE権限が必要です。 また、schema_nameを指定しない場合は、SET_DML_HANDLERプロシージャの起動ユーザー名がデフォルトで使用されます。

たとえば、procedure_nameのプロパティが次のとおりであるとします。

この場合、次のように指定します。

hr.apply_pkg.employees_default

ユーザー・プロシージャには、次の制限事項が適用されます。


関連項目:

DMLハンドラおよびデータ型(LOB、LONGLONG RAW)の詳細と制限は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。

DMLハンドラ・プロシージャの署名

user_procedureパラメータに指定されるプロシージャには、次の署名が必要です。

PROCEDURE user_procedure (
   parameter_name  IN  ANYDATA);

user_procedureはプロシージャ名、parameter_nameはプロシージャに渡されるパラメータ名を表します。プロシージャに渡されるパラメータは、行LCRをANYDATAにカプセル化したものです。


関連項目:

LCRの詳細は、第228章「論理変更レコードのタイプ」を参照してください。

エラー・ハンドラ・プロシージャの署名

エラー処理用に作成するプロシージャには、次の署名が必要です。

PROCEDURE user_procedure (
     message            IN  ANYDATA,
     error_stack_depth  IN  NUMBER,
     error_numbers      IN  DBMS_UTILITY.NUMBER_ARRAY,
     error_messages     IN  emsg_array);

エラー・ハンドラ内でDML操作を再試行する場合は、エラー・ハンドラ・プロシージャで、LCRに対してEXECUTEメンバー・プロシージャを実行してください。最後に発生したエラーがエラー・スタックの一番上にあります。 エラー・スタックの一番上のエラー・メッセージを指定するには、error_numbers(1)およびerror_messages(1)を使用します。


注意:

  • 各パラメータは必須で、指定のデータ型であることが必要です。ただし、パラメータの名前は変更できます。

  • emsg_array値はユーザー定義配列で、76文字以上のVARCHAR2型の表であることが必要です。


エラー・ハンドラを実行すると、次のいずれかの結果になります。


SET_ENQUEUE_DESTINATIONプロシージャ

このプロシージャでは、指定したルールを満たすメッセージが適用プロセスによって自動的にエンキューされるキューを設定します。

このプロシージャによって、指定したルールのアクション・コンテキストを変更し、キューを指定します。ルールのアクション・コンテキストは、ルールがメッセージに対してTRUEに評価された後、ルール・エンジンのクライアントが解析するルールに関連付けられているオプションの情報です。この場合、ルール・エンジンのクライアントはOracle Streams適用プロセスです。アクション・コンテキスト内の情報はSYS.RE$NV_LISTタイプのオブジェクトであり、名前/値ペアで構成されています。

このプロシージャで指定するキューの宛先は、アクション・コンテキスト内の次の名前/値ペアで常に構成されます。

構文

DBMS_APPLY_ADM.SET_ENQUEUE_DESTINATION(
  rule_name               IN  VARCHAR2,
  destination_queue_name  IN  VARCHAR2);

パラメータ

表20-14 SET_ENQUEUE_DESTINATIONプロシージャのパラメータ

パラメータ 説明

rule_name

ルールの名前。[schema_name.]rule_nameの形式で指定します。たとえば、hrスキーマのhr5という名前のルールを指定するには、このパラメータにhr.hr5と入力します。スキーマを指定しない場合は、現行のユーザー名がデフォルトで使用されます。

destination_queue_name

適用プロセスがメッセージをエンキューするキューの名前。 キューを[schema_name.]queue_nameの形式で指定します。ローカル・キューのみを指定できます。

たとえば、hrスキーマ内のstreams_queueという名前のキューを指定するには、hr.streams_queueと入力します。スキーマを指定しない場合は、現行のユーザー名がデフォルトで使用されます。

NULLを指定すると、名前APPLY$_ENQUEUEを持つ既存の名前/値ペアが削除されます。 名前APPLY$_ENQUEUEを持つ名前/値ペアがルールに対して存在しない場合、アクションは実行されません。

NULL以外を指定したときに、名前APPLY$_ENQUEUEを持つ名前/値ペアがルールに対してすでに存在する場合は、それが削除され、このパラメータで指定する値を持つ新しい名前/値ペアが追加されます。


使用上の注意

DMLハンドラ、DDLハンドラ、メッセージ・ハンドラなどの適用ハンドラは、宛先キューにもエンキューされるメッセージを処理する場合、そのメッセージがエンキューされる前に処理します。

このプロシージャを使用する場合は、次の点に注意してください。


SET_EXECUTEプロシージャ

このプロシージャでは、指定したルールを満たすメッセージを適用プロセスによって実行するかどうかを指定します。

このプロシージャによって、指定したルールのアクション・コンテキストを変更し、メッセージの実行を指定します。ルールのアクション・コンテキストは、ルールがメッセージに対してTRUEに評価された後、ルール・エンジンのクライアントが解析するルールに関連付けられているオプションの情報です。この場合、ルール・エンジンのクライアントはOracle Streams適用プロセスです。アクション・コンテキスト内の情報はSYS.RE$NV_LISTタイプのオブジェクトであり、名前/値ペアで構成されています。

このプロシージャで指定するメッセージ実行ディレクティブは、アクション・コンテキスト内の次の名前/値ペアで常に構成されます。

構文

DBMS_APPLY_ADM.SET_EXECUTE(
  rule_name  IN  VARCHAR2,
  execute    IN  BOOLEAN);

パラメータ

表20-15 SET_EXECUTEプロシージャのパラメータ

パラメータ 説明

rule_name

ルールの名前。[schema_name.]rule_nameの形式で指定します。たとえば、hrスキーマのhr5という名前のルールを指定するには、このパラメータにhr.hr5と入力します。スキーマを指定しない場合は、現行のユーザー名がデフォルトで使用されます。

execute

TRUEの場合、指定したルールにおいて、名前APPLY$_EXECUTEを持つ名前/値ペアが削除されます。名前/値ペアを削除することは、ルールを満たすメッセージを適用プロセスが実行することです。 名前APPLY$_EXECUTEを持つ名前/値ペアがルールに対して存在しない場合、アクションは実行されません。

FALSEの場合、ルールのアクション・コンテキストに名前/値ペアが追加されます。 名前は、APPLY$_EXECUTEです。値は、NOです。適用プロセスは、ルールを満足するメッセージを実行せず、メッセージを適用ハンドラに送りません。 名前APPLY$_EXECUTEを持つ名前/値ペアがルールに対してすでに存在する場合は、それが削除され、値NOを持つ新しい名前/値ペアが追加されます。

NULLの場合は、エラーが発生します。


使用上の注意

メッセージが論理変更レコード(LCR)のときにそのメッセージが実行されない場合、関連するローカル・データベース・オブジェクトに対して、LCRにカプセル化された変更は実行されません。また、メッセージが実行されない場合、そのメッセージは適用ハンドラに送られません。


注意:

  • Oracle Streamsの取得プロセス、伝播、メッセージ・クライアントは、このプロシージャによって作成されるアクション・コンテキストを無視します。

  • 指定したルールは、適用プロセスのポジティブ・ルール・セット内に存在して実行ディレクティブに従う必要があります。ルールが適用プロセスのネガティブ・ルール・セットに含まれる場合、適用プロセスはルールの実行ディレクティブを無視します。



SET_GLOBAL_INSTANTIATION_SCNプロシージャ

このプロシージャでは、指定したソース・データベースに対して、およびオプションで、ソース・データベースのスキーマとそのスキーマが所有する表に対して、指定したインスタンス化SCNを記録します。このプロシージャは、データベースの既存のインスタンス化SCNを上書きしますが、スキーマまたは表のインスタンス化SCNを設定する場合は、スキーマまたは表の既存のインスタンス化SCNを上書きします。

このプロシージャを使用すると、ソース・データベースのDDL論理変更レコード(DDL LCR)の中で、適用プロセスで無視するものと適用するものを正確に制御できます。

構文

DBMS_APPLY_ADM.SET_GLOBAL_INSTANTIATION_SCN(
  source_database_name  IN  VARCHAR2,
  instantiation_scn     IN  NUMBER,
  apply_database_link   IN  VARCHAR2  DEFAULT NULL,
  recursive             IN  BOOLEAN   DEFAULT FALSE);

パラメータ

表20-16 SET_GLOBAL_INSTANTIATION_SCNプロシージャのパラメータ

パラメータ 説明

source_database_name

ソース・データベースのグローバル名。たとえば、DBS1.NETのようになります。

ドメイン名を指定しない場合は、自動的にドメイン名がデータベース名に追加されます。たとえば、ドメイン名が.NETの場合にDBS1を指定すると、自動的にDBS1.NETが指定されます。

instantiation_scn

インスタンス化SCN。NULLを指定すると、ソース・データベースに対するインスタンス化SCNのメタデータがデータ・ディクショナリから削除されます。

apply_database_link

Oracle以外のデータベースへのデータベース・リンクの名前。このパラメータは、ローカル適用プロセスの接続先データベースがOracle以外のデータベースの場合にのみ設定する必要があります。

recursive

TRUEの場合、ソース・データベース、ソース・データベースのすべてのスキーマ、ソース・データベースのスキーマが所有するすべての表に対して、インスタンス化SCNが設定されます。 このプロシージャは、現行のユーザーのセキュリティ・コンテキストの下のソース・データベースにおいて、ALL_USERSデータ・ディクショナリ・ビューからスキーマを、ALL_TABLESデータ・ディクショナリ・ビューから表を選択します。

FALSEの場合、ソース・データベースのグローバル・インスタンス化SCNは設定されますが、スキーマまたは表のインスタンス化SCNは設定されません。

注意: recursiveTRUEに設定する場合は、接続先データベースからソース・データベースへのデータベース・リンクが必要です。その場合、データベース・リンクにはソース・データベースのグローバル名と同じ名前を付けて、現行のユーザーからアクセスできるようにしてください。また、このプロシージャで接続先データベースの表にインスタンス化SCNを設定するには、ソース・データベースのALL_TABLESまたはDBA_TABLESデータ・ディクショナリ・ビューの現行のユーザーから表にアクセスできるようにしてください。


使用上の注意

ソース・データベースからのデータベース・オブジェクトに対するDDL LCRのコミットSCNが、接続先データベースでそのソース・データベースに対するインスタンス化SCN以下の場合は、接続先データベースでの適用プロセスで、そのDDL LCRは無視されます。それ以外の場合は、DDL LCRが適用されます。

このプロシージャで指定するグローバル・インスタンス化SCNがDDL LCRに対して使用されるのは、object_ownerbase_table_ownerおよびbase_table_nameがDDL LCRに指定されていない場合のみです。 たとえば、このプロシージャによって設定されるグローバル・インスタンス化SCNは、command_typeCREATE USERのDDL LCRに使用されます。

recursiveパラメータをTRUEに設定すると、このプロシージャは、ソース・データベースの各スキーマおよびそのスキーマが所有している表にインスタンス化SCNを設定します。 このプロシージャでは、スキーマにインスタンス化SCNを設定する場合はSET_SCHEMA_INSTANTIATION_SCNプロシージャ、表にインスタンス化SCNを設定する場合はSET_TABLE_INSTANTIATION_SCNプロシージャを使用します。スキーマのDDL LCRにはスキーマのインスタンス化SCNが使用され、表のDDL LCRと行LCRには表のインスタンス化SCNが使用されます。

recursiveパラメータをFALSEに設定すると、スキーマや表にはインスタンス化SCNが設定されません。


注意:

  • このプロシージャによって指定されるインスタンス化SCNは、取得プロセスによって取得されたLCRに対してのみ使用されます。ユーザーが作成したLCRには使用されません。

  • インスタンス化SCNは、SYSスキーマやSYSTEMスキーマには設定できません。



関連項目:



SET_KEY_COLUMNSプロシージャ

このプロシージャでは、適用の目的で代替主キーとして使用される列セットを記録し、指定オブジェクトに対する既存の代替主キー列が存在する場合は、それを削除します。

このプロシージャはオーバーロードされています。column_listパラメータとcolumn_tableパラメータは、両方同時には指定できません。

構文

DBMS_APPLY_ADM.SET_KEY_COLUMNS(
   object_name          IN  VARCHAR2,
   column_list          IN  VARCHAR2,
   apply_database_link  IN  VARCHAR2  DEFAULT NULL);

DBMS_APPLY_ADM.SET_KEY_COLUMNS(
   object_name          IN  VARCHAR2,
   column_table         IN  DBMS_UTILITY.NAME_ARRAY,
   apply_database_link  IN  VARCHAR2  DEFAULT NULL);

パラメータ

表20-17 SET_KEY_COLUMNSプロシージャのパラメータ

パラメータ 説明

object_name

表の名前。[schema_name.]object_nameの形式で指定します。たとえば、hr.employeesのように指定します。スキーマを指定しない場合は、現行のユーザー名がデフォルトで使用されます。適用プロセスが異機種環境のOracle以外のデータベースに変更を適用している場合、オブジェクト名は検証されません。

column_list

代替主キーとして使用する、表内の列のカンマで区切られたリスト。列名の間に空白は入れません。

column_listパラメータが空またはNULLの場合は、現行のキー列のセットが削除されます。

column_table

代替主キーとして使用する、表内の列のDBMS_UTILITY.NAME_ARRAYタイプのPL/SQL索引付き表。 column_tableの索引は1から始まり、1ずつ増え、NULLで終了する必要があります。

column_tableパラメータが空またはNULLの場合は、現行のキー列のセットが削除されます。

apply_database_link

Oracle以外のデータベースへのデータベース・リンクの名前。このパラメータは、接続先データベースがOracle以外のデータベースの場合にのみ設定する必要があります。


使用上の注意

空でない場合、この列セットは、指定オブジェクトの主キーより優先されます。オブジェクトにすでに主キー列があり、これらの主キー列をキーとして使用する場合は、代替キー列を指定しないでください。

このプロシージャは、接続先データベースで実行します。ソース・データベースでは、代替キー列に対して絶対的な補助ログ・グループを指定する必要があります。


注意:

  • 本来の主キーとは異なり、代替キー列として指定する列にはNULLを含めることができますが、代替キー列として指定する列はNOT NULL列にすることをお薦めします。また、すべての列を代替キーに含める単一の索引も作成してください。これらのガイドラインに従うと、Oracleは関連する行をさらに効率的に検索できるため、LOBに対する更新、削除およびピース単位の更新のパフォーマンスが向上します。

  • 表の主キー列または代替キー列は、アプリケーションで更新できないようにしてください。更新できないようにすることにより、Oracleは行を識別でき、データの整合性を保つことができます。

  • 主キーも、少なくとも1つのNOT NULL列がある一意の索引も、表の代替キーもない場合、キーはすべての非LOB列、非LONG列、非LONG RAW列から構成されます。



SET_PARAMETERプロシージャ

このプロシージャでは、適用パラメータを指定した値に設定します。

構文

DBMS_APPLY_ADM.SET_PARAMETER (
   apply_name  IN  VARCHAR2,
   parameter   IN  VARCHAR2,
   value       IN  VARCHAR2  DEFAULT NULL);

パラメータ

表20-18 SET_PARAMETERプロシージャのパラメータ

パラメータ 説明

apply_name

適用プロセス名。所有者を指定しないでください。

parameter

設定するパラメータの名前。これらのパラメータのリストについては、「適用プロセスのパラメータ」を参照してください。

value

パラメータに設定する値。

NULLの場合、パラメータはデフォルト値に設定されます。


適用プロセスのパラメータ

次の表に、適用プロセスのパラメータを示します。

表20-19 適用プロセスのパラメータ

パラメータ名 設定可能な値 デフォルト 説明

allow_duplicate_rows

YまたはN

N

Yの場合、UPDATEまたはDELETEコマンド・タイプを持つ単一の行論理変換レコード(行LCR)によって複数の行が変更されていると、適用プロセスではそれらの行の中の1行のみが更新または削除されます。

Nの場合、適用プロセスでは、表内の複数の行を変更する、UPDATEまたはDELETEコマンド・タイプを持つ単一行LCRが検出されると、エラーが発生します。

注意: このパラメータの設定に関係なく、適用プロセスでは、LOB列、LONG列またはLONG RAW列が含まれている表の重複行に対して変更を行うことはできません。

関連項目: 「重複行と代替主キー列」

commit_serialization

fullまたはnone

full

適用済トランザクションがコミットされる順序。

適用サーバーは、ソース・データベースでのコミット時と異なる順で、接続先データベースで非依存トランザクションを適用できます。 依存トランザクションは、ソース・データベースでのコミット時と常に同じ順序で、接続先データベースで適用されます。

commit_serialization適用パラメータを使用して、適用サーバーが、接続先データベースで異なる順序で非依存トランザクションを適用できるかどうかを制御します。 このパラメータの設定は次のとおりです。

  • full: 適用プロセスは、ソース・データベースでコミットされた順序で、適用済トランザクションをコミットします。

  • none: 適用プロセスは、任意の順序でトランザクションをコミットできます。noneを指定すると、パフォーマンスは最大になります。

適用するトランザクションは、指定に関係なく、データ依存性と制約依存性に従って、パラレルで実行できます。

ロジカル・スタンバイ環境では、通常fullを指定します。

noneを指定すると、接続先データベースにソース・データベースとは異なる順序で変更をコミットすることができます。 たとえば、ソース・データベースでは、2つの非依存トランザクションが次の順序でコミットされるとします。

  1. トランザクションA

  2. トランザクションB

接続先データベースでは、これらのトランザクションが逆の順序でコミットされる可能性があります。

  1. トランザクションB

  2. トランザクションA

disable_on_error

YまたはN

Y

Yの場合は、未解決の最初のエラーによって、そのエラーが致命的なエラーでない場合でも、適用プロセスは無効化されます。

Nの場合は、未解決のエラーがある場合でも適用プロシージャは続行されます。

disable_on_limit

YまたはN

N

Yの場合は、time_limitパラメータまたはtransaction_limitパラメータによって指定された値に達したために適用プロセスが終了すると、適用プロセスは無効化されます。

Nの場合、適用プロセスは、制限に達したために停止した後すぐに再開されます。

再開された適用プロセスは、新しいセッション識別子を取得します。また、この適用プロセスに関連付けられているプロセスも新しいセッション識別子を取得します。 ただし、コーディネータ・プロセス番号(APnn)は変更されません。

maximum_scn

有効なSCN値またはinfinite

infinite

適用プロセスは、指定された値以上のコミットSCNを持つトランザクションの適用前に無効化されます。

infiniteの場合は、SCNの値に関係なく適用プロセスが実行されます。

parallelism

正の整数

1

トランザクションを同時に適用できる適用サーバーの数。 たとえば、parallelismを5に設定すると、適用プロセスでは合計5つの適用サーバーが使用されます。 リーダー・サーバーはプロセスです。 このため、parallelismを5に設定すると、適用プロセスでは、合計6つのプロセスが使用されます。 適用プロセスでは、常に、2つ以上のプロセスが使用されます。

parallelismパラメータを、使用可能なパラレル実行サーバー数より大きい値に設定すると、適用プロセスが無効になる場合があります。 parallelism適用プロセス・パラメータを設定するときは、PROCESSESおよびPARALLEL_MAX_SERVERS初期化パラメータが適切に設定されていることを確認してください。

注意: 実行中の適用プロセスに対してこのパラメータの値を変更すると、適用プロセスは自動的に停止し、再開します。現在適用中のトランザクションのサイズによっては、時間がかかる場合があります。

preserve_encryption

YまたはN

Y

透過的なデータの暗号化を使用して暗号化された列の暗号化を保持するかどうか。

Yの場合、接続先データベースの表内の列は、行LCR内の対応する列の暗号化時に暗号化する必要があります。行LCR内の列が暗号化され、接続先データベースの表内の列が暗号化されなかった場合、適用プロセスで行LCRを適用しようとするとエラーが発生します。

Nの場合、接続先データベースの表内の列は、行LCR内の対応する列の暗号化時に暗号化する必要はありません。行LCR内の列が暗号化され、接続先データベース内の表の列が暗号化されなかった場合、適用プロセスは行LCRの変更を適用します。

注意: 実行中の適用プロセスに対してこのパラメータの値を変更すると、適用プロセスは自動的に停止し、再開します。現在適用中のトランザクションのサイズによっては、時間がかかる場合があります。

rtrim_on_implicit_conversion

YまたはN

Y

適用時に自動データ型変換が実行された場合に、列の右端の空白埋めを削除するかどうか。

Yの場合、行LCR内のCHARソース列またはNCHARソース列が表内のVARCHAR2列、NVARCHAR2列またはCLOB列に変換されたときに空白埋めが削除されます。

Nの場合、列の空白埋めが保持されます。

関連項目: 適用時の自動データ型変換の詳細は、『Oracle Streams概要および管理』を参照してください。

startup_seconds

0、正の整数またはinfinite

0

同じ適用プロセスの別のインスタンス化が終了するのを待機する最大秒数。同じ適用プロセスの別のインスタンス化がこの時間内に終了しない場合、適用プロセスは開始しません。

infiniteの場合、適用プロセスは、同じ適用プロセスの別のインスタンス化が終了した後で開始します。

time_limit

正の整数またはinfinite

infinite

適用プロセスは、開始してから指定秒数が経過した後、可能なかぎり早く停止します。

infiniteの場合、適用プロセスは明示的に停止されるまで実行し続けます。

trace_level

0または正の整数

0

Oracleサポート・サービスから指示がないかぎり、このパラメータは設定しないでください。

transaction_limit

正の整数またはinfinite

infinite

適用プロセスは、指定した数のトランザクションを適用した後停止します。

infiniteの場合は、適用したトランザクションの数に関係なく実行し続けます。

txn_lcr_spill_threshold

正の整数またはinfinite

10000

メモリー内の特定のトランザクションのメッセージ数が、指定した数を超えると、適用プロセスによって、メモリーからハードディスクへの書出しが開始されます。メモリーから書き出される最初のチャンクのメッセージの数は、このパラメータに指定した数と同じです。それ以降のチャンクで書き出されるメッセージの数は、100またはこのパラメータに指定した数のいずれか小さいほうと同じになります。

適用プロセスのリーダー・サーバーでは、指定した数のメッセージが特定のトランザクションに対してメモリー内に保持されている場合、そのトランザクションに対する次のメッセージが検出されると、メモリー内のメッセージがハードディスクに書き出されます。たとえば、パラメータの設定が10000で、トランザクションに10,200個のメッセージがある場合、そのトランザクションはリーダー・サーバーによって次のように処理されます。

  1. トランザクションの最初の10,000個のメッセージがメモリーに読み込まれます。

  2. メッセージ10,000が検出されると、メッセージ1から10,000がハードディスクに書き出されます。

  3. トランザクションの次の100個のメッセージがメモリーに読み込まれます。

  4. メッセージ10,100が検出されると、メッセージ10,001から10,100がハードディスクに書き出されます。

  5. トランザクションの次の100個のメッセージがメモリーに読み込まれます。

適用プロセスは、最初の10,100個のメッセージをハードディスクから適用し、最後の100個のメッセージをメモリーから適用します。

リーダー・サーバーによってメモリーから書き出されたメッセージは、ハードディスク上のデータベース表に格納されます。これらのメッセージは、メモリーからキュー表へは書き出されません。

メッセージの書出しは、トランザクション単位で行われます。たとえば、このパラメータの設定が10000の場合、適用プロセスのリーダー・サーバーで、7,500個のメッセージがあるトランザクションと8,000個のメッセージがあるトランザクションの2つをアセンブルしていても、メッセージは書き出されません。

infiniteの場合、適用プロセスによってハードディスクへのメッセージの書出しは行われません。

適用プロセスによって書き出されたトランザクションについては、DBA_APPLY_SPILL_TXNデータ・ディクショナリ・ビューを問い合せてください。

注意: 実行中の適用プロセスに対してこのパラメータの値を変更すると、新しい設定は、適用プロセスを再起動するまで有効になりません。

write_alert_log

YまたはN

Y

Yの場合、適用プロセスは、終了時にアラート・ログにメッセージを書き込みます。

Nの場合は、終了時にアラート・ログにメッセージを書き込みません。

メッセージには、適用プロセスの停止理由が示されます。


使用上の注意

パラメータ値を変更したとき、パラメータの新しい値が有効になるまでに時間がかかる場合があります。


注意:

  • 正の整数として解釈されるすべてのパラメータについて、設定可能な最大値は4,294,967,295です。適用可能な場合、比較的大きい値にはinfiniteを指定してください。

  • SCN設定が必要なパラメータについては、任意の有効なSCN値を指定できます。


重複行と代替主キー列

表の複数の行で、LOB列、LONG列およびLONG RAW列を除くすべての列値が同じ場合、その表には重複行が含まれています。 SET_KEY_COLUMNSプロシージャを使用すると、接続先データベースの表に、代替主キー列を指定できます。 接続先データベースの重複行を持つ表に対して代替主キー列が指定され、適用プロセス・パラメータallow_duplicate_rowsYに設定されている場合、ソース・データベースと接続先データベースで表データを同期させるには、次の要件を満たしている必要があります。

この項の後半では、これらの要件の詳細を説明します。

主キー、少なくとも1つのNOT NULL列がある一意の索引、または代替キーのいずれも表に含まれていない場合、キーはすべての非LOB列、非LONG列、非LONG RAW列から構成されます。 表にキーがなく、allow_duplicate_rows適用プロセス・パラメータがYに設定されている場合、UPDATEまたはDELETEコマンド・タイプのみを持つ単一の行LCRは、いずれかの重複行に適用されます。この場合、ソース・データベースのすべての重複行が変更される変更を行う際にソース・データベースの表および接続先データベースの表に対応する重複行が存在すると、その変更の結果生成された行LCRの適用時に、接続先データベースのすべての重複行も変更されます。

たとえば、ソース・データベースの表に2つの重複行があるとします。それらの重複行に対して更新を行うと、2つの行LCRが生成されます。接続先データベースでは、1つの行LCRが重複行の1つに適用されます。重複行の1つが変更されたため、この時点で、接続先データベースに重複行は存在しなくなります。接続先データベースで2番目の行LCRが適用されると、行は再度重複することになります。同様に、ソース・データベースのこれらの重複行に対して削除を実行すると、変更の結果生成された行LCRの適用時に、接続先データベースの両方の行が削除されます。

表に対して代替主キー列が指定されている場合、行LCRは、代替主キー列に基づいて適用時に表内の行で識別されます。 接続先データベースの重複行を持つ表に対して代替主キー列が指定され、適用プロセス・パラメータallow_duplicate_rowsYに設定されている場合、ソース・データベースの重複行に対して行った更新の内容が、接続先データベースで行LCRが適用される際の変更の内容と異なることがあります。特に、代替主キー列として指定されている列の1つが更新によって変更されない場合、接続先データベースでは、同じ重複行が複数回更新され、他の重複行が更新されないことがあります。

また、接続先データベースの表内の各行が代替キー列によって一意に識別されない場合は、複数行で識別される行LCRで、それらの行のいずれかを更新できます。この場合、行LCR内の更新内容が、接続先データベースの表の正しい行に適用されない可能性があります。

適用プロセスでは、表内の行が重複しているかどうかを判断する場合、代替主キー列は無視されます。適用プロセスでは、行内のLOB列、LONG列およびLONG RAW列を除くすべての列値が同じ場合にのみ、行が重複していると判断されます。したがって、1回の更新または削除によって、表内の重複していない複数の行が変更されると、常にエラーが発生します。

たとえば、列c1c2およびc3を持つ表で、列c1を代替主キーとして指定するためにSET_KEY_COLUMNSプロシージャが使用されているとします。2つの行のc1列のキー値が同じで、c2列またはc3列の値が異なっている場合、適用プロセスでは、これらの行は重複行として処理されません。 行のc1値が同じであるため、更新または削除によって複数の行が変更される場合は、allow_duplicate_rows適用プロセス・パラメータの設定に関係なく、エラーが発生します。


SET_SCHEMA_INSTANTIATION_SCNプロシージャ

このプロシージャでは、指定したソース・データベース内の指定のスキーマに対して、およびオプションで、ソース・データベースのスキーマが所有する表に対して、指定したインスタンス化SCNを記録します。このプロシージャは、スキーマの既存のインスタンス化SCNを上書きしますが、表のインスタンス化SCNを設定する場合は、表の既存のインスタンス化SCNを上書きします。

このプロシージャを使用すると、スキーマに対するDDL論理変更レコード(LCR)の中で、適用プロセスで無視するものと適用するものを正確に制御できます。

構文

DBMS_APPLY_ADM.SET_SCHEMA_INSTANTIATION_SCN(
  source_schema_name    IN  VARCHAR2,
  source_database_name  IN  VARCHAR2,
  instantiation_scn     IN  NUMBER,
  apply_database_link   IN  VARCHAR2  DEFAULT NULL,
  recursive             IN  BOOLEAN   DEFAULT FALSE);

パラメータ

表20-20 SET_SCHEMA_INSTANTIATION_SCNプロシージャのパラメータ

パラメータ 説明

source_schema_name

ソース・スキーマの名前。たとえば、hrのように指定します。

source_database_name

ソース・データベースのグローバル名。たとえば、DBS1.NETのようになります。

ドメイン名を指定しない場合は、自動的にドメイン名がデータベース名に追加されます。たとえば、ドメイン名が.NETの場合にDBS1を指定すると、自動的にDBS1.NETが指定されます。

instantiation_scn

インスタンス化SCN。NULLを指定すると、ソース・スキーマに対するインスタンス化SCNのメタデータがデータ・ディクショナリから削除されます。

apply_database_link

Oracle以外のデータベースへのデータベース・リンクの名前。このパラメータは、ローカル適用プロセスの接続先データベースがOracle以外のデータベースの場合にのみ設定する必要があります。

recursive

TRUEの場合、指定したスキーマに対して、またソース・データベースのスキーマが所有するすべての表に対して、インスタンス化SCNが設定されます。 このプロシージャは、現行のユーザーのセキュリティ・コンテキストにおいて、ソース・データベースのALL_TABLESデータ・ディクショナリ・ビューから、指定したスキーマによって所有される表を選択します。

FALSEの場合、指定したスキーマのインスタンス化SCNは設定されますが、表のインスタンス化SCNは設定されません。

注意: recursiveTRUEに設定する場合は、接続先データベースからソース・データベースへのデータベース・リンクが必要です。その場合、データベース・リンクにはソース・データベースのグローバル名と同じ名前を付けて、現行のユーザーからアクセスできるようにしてください。また、このプロシージャで接続先データベースの表にインスタンス化SCNを設定するには、ソース・データベースのALL_TABLESまたはDBA_TABLESデータ・ディクショナリ・ビューの現行のユーザーから表にアクセスできるようにしてください。


使用上の注意

ソース・データベースからのスキーマ内のデータベース・オブジェクトに対するDDL LCRのコミットSCNが、接続先データベースでそのデータベース・オブジェクトに対するインスタンス化SCN以下の場合は、接続先データベースでの適用プロセスで、そのDDL LCRは無視されます。それ以外の場合は、DDL LCRが適用されます。

このプロシージャによって指定されるスキーマ・インスタンス化SCNは、次のタイプのDDL LCRで使用されます。

たとえば、このプロシージャによって設定されるスキーマ・インスタンス化SCNは、command_typeCREATE TABLEおよびALTER USERのDDL LCRに使用されます。

このプロシージャによって指定されるスキーマ・インスタンス化SCNは、command_typeCREATE USERのDDL LCRには使用されません。そうしたDDL LCRには、グローバル・インスタンス化SCNが必要です。

recursiveパラメータをTRUEに設定すると、このプロシージャは、スキーマが所有しているソース・データベースの各表に表インスタンス化SCNを設定します。 このプロシージャでは、SET_TABLE_INSTANTIATION_SCNプロシージャを使用して各表のインスタンス化SCNを設定します。表のDDL LCRおよび行LCRには、各表のインスタンス化SCNが使用されます。

recursiveパラメータをFALSEに設定すると、表にインスタンス化SCNは設定されません。


注意:

このプロシージャによって指定されるインスタンス化SCNは、取得プロセスによって取得されたLCRに対してのみ使用されます。ユーザーが作成したLCRには使用されません。


関連項目:



SET_TABLE_INSTANTIATION_SCNプロシージャ

このプロシージャでは、指定したソース・データベース内の指定表に対する指定インスタンス化SCNを記録します。このプロシージャは、特定の表に対する既存のインスタンス化SCNを上書きします。

このプロシージャを使用すると、表に対する論理変更レコード(LCR)の中で、適用プロセスで無視するものと適用するものを正確に制御できます。

構文

DBMS_APPLY_ADM.SET_TABLE_INSTANTIATION_SCN(
  source_object_name    IN  VARCHAR2,
  source_database_name  IN  VARCHAR2,
  instantiation_scn     IN  NUMBER,
  apply_database_link   IN  VARCHAR2  DEFAULT NULL);

パラメータ

表20-21 SET_TABLE_INSTANTIATION_SCNプロシージャのパラメータ

パラメータ 説明

source_object_name

ソース・オブジェクトの名前。[schema_name.]object_nameの形式で指定します。たとえば、hr.employeesのように指定します。スキーマを指定しない場合は、現行のユーザー名がデフォルトで使用されます。

source_database_name

ソース・データベースのグローバル名。たとえば、DBS1.NETのようになります。

ドメイン名を指定しない場合は、自動的にドメイン名がデータベース名に追加されます。たとえば、ドメイン名が.NETの場合にDBS1を指定すると、自動的にDBS1.NETが指定されます。

instantiation_scn

インスタンス化SCN。NULLを指定すると、ソース表に対するインスタンス化SCNのメタデータがデータ・ディクショナリから削除されます。

apply_database_link

Oracle以外のデータベースへのデータベース・リンクの名前。このパラメータは、ローカル適用プロセスの接続先データベースがOracle以外のデータベースの場合にのみ設定する必要があります。


使用上の注意

ソース・データベースからの表に対するLCRのコミットSCNが、一部の接続先データベースでその表に対するインスタンス化SCN以下の場合は、接続先データベースでの適用プロセスで、そのLCRは無視されます。それ以外の場合は、LCRが適用されます。

このプロシージャによって指定される表のインスタンス化SCNは、次のタイプのLCRで使用されます。

たとえば、このプロシージャによって設定されるインスタンス化SCNは、command_typeALTER TABLEまたはCREATE TRIGGERのDDL LCRに対して使用されます。


注意:

このプロシージャによって指定されるインスタンス化SCNは、取得プロセスによって取得されたLCRに対してのみ使用されます。ユーザーが作成したLCRには使用されません。


関連項目:



SET_UPDATE_CONFLICT_HANDLERプロシージャ

このプロシージャは、指定オブジェクト用に事前作成された更新競合ハンドラを追加、変更または削除します。

構文

DBMS_APPLY_ADM.SET_UPDATE_CONFLICT_HANDLER(
   object_name          IN  VARCHAR2,
   method_name          IN  VARCHAR2,
   resolution_column    IN  VARCHAR2,
   column_list          IN  DBMS_UTILITY.NAME_ARRAY,
   apply_database_link  IN  VARCHAR2  DEFAULT NULL);

パラメータ

表20-22 SET_UPDATE_CONFLICT_HANDLERプロシージャのパラメータ

パラメータ 説明

object_name

更新競合ハンドラが追加、変更または削除されるスキーマと表の名前。[schema_name.]object_nameの形式で指定します。

たとえば、ユーザーhrが所有する表employeesに更新競合ハンドラを追加する場合は、hr.employeesと指定します。スキーマを指定しない場合は、現行のユーザー名がデフォルトで使用されます。

method_name

作成する更新競合ハンドラのタイプ。

事前作成されたハンドラの1つを指定できます。このハンドラは、行に対してソース・データベースの列リストを適用するかどうか、または接続先データベースの行の値を保持するかどうかを決定します。

  • MAXIMUM: ソース・データベースの列リストの値が解消列に関して大きい場合は、そのソース・データベースの列リストを適用します。それ以外の場合は、接続先データベースの値を保持します。

  • MINIMUM: ソース・データベースの列リストの値が解消列に関して小さい場合は、そのソース・データベースの列リストを適用します。それ以外の場合は、接続先データベースの値を保持します。

  • OVERWRITE: ソース・データベースの列リストを適用し、接続先データベースの列の値を上書きします。

  • DISCARD: 接続先データベースの列リストを保持し、ソース・データベースの列リストを廃棄します。

NULLの場合は、同じobject_nameresolution_columnおよびcolumn_listを持つ既存の更新競合ハンドラを削除します。 NULL以外の場合は、同じobject_nameおよびresolution_columnを持つ既存の更新競合ハンドラを置換します。

resolution_column

更新競合ハンドラを一意に識別するために使用される列の名前。MAXIMUMおよびMINIMUM事前作成メソッドの場合、解消列は競合の解消にも使用されます。 解消列は、column_listパラメータにリストされた列の1つであることが必要です。

このパラメータにNULLは指定できません。OVERWRITEおよびDISCARD事前作成メソッドの場合は、列リスト内のどの列でも指定できます。

column_list

競合ハンドラがコールされる列のリスト。

適用プロセスが行論理変更レコード(行LCR)を適用しようとしたときに、リスト内の1つ以上の列に対して競合が発生すると、競合を解消するために競合ハンドラがコールされます。競合ハンドラは、リストにない列でのみ競合が発生した場合はコールされません。

注意: 事前作成された更新競合ハンドラでは、LOB列、LONG列、LONG RAW列、およびユーザー定義型の列がサポートされません。 列がこれらのタイプである場合は、column_listパラメータに指定しないでください。

apply_database_link

Oracle以外のデータベースへのデータベース・リンクの名前。このパラメータは、接続先データベースがOracle以外のデータベースの場合にのみ設定する必要があります。

注意: 現在、Oracle以外のデータベースに変更を適用するときに、競合ハンドラはサポートされません。


使用上の注意

既存の更新競合ハンドラを変更する場合は、既存の更新競合ハンドラの表と解消列を指定します。事前作成メソッドまたは列リストを変更できます。

既存の更新競合ハンドラを削除する場合は、事前作成メソッドにNULLを指定し、既存の更新競合ハンドラの表、列リストおよび解消列を指定します。

更新の競合が発生した場合、次の一連の処理が実行されます。

  1. 適切な更新競合ハンドラをコールして、競合を解消します。

  2. 更新競合ハンドラが指定されていない場合、または更新競合ハンドラで競合を解消できない場合は、適用プロセス、表および操作に対する適切なエラー・ハンドラをコールしてエラーを処理します。

  3. エラー・ハンドラが指定されていない、またはエラー・ハンドラでエラーを解決できない場合は、エラーが発生し、エラーの原因となった行LCRが含まれているトランザクションがエラー・キューに移されます。

事前作成された更新競合ハンドラを使用して要件を満たすことができない場合は、PL/SQLプロシージャを作成し、カスタム競合ハンドラとして使用できます。 特定の表に対して1つ以上のカスタム競合ハンドラを指定するには、SET_DML_HANDLERプロシージャを使用します。また、カスタム競合ハンドラでは、LOB列を処理し、LOBアセンブリを使用することができます。


注意:

現在、Oracle以外のデータベースに適用している適用プロセスに対する更新競合ハンドラの設定はサポートされていません。


関連項目:


次は、hrスキーマ内のemployees表に対して更新競合ハンドラを設定する場合の例です。

DECLARE
  cols  DBMS_UTILITY.NAME_ARRAY;
BEGIN
  cols(1) := 'salary';
  cols(2) := 'commission_pct';
  DBMS_APPLY_ADM.SET_UPDATE_CONFLICT_HANDLER(
    object_name           =>  'hr.employees',
    method_name           =>  'MAXIMUM',
    resolution_column     =>  'salary',
    column_list           =>  cols);
END;
/

この例では、hr.employees表内のsalary列またはcommission_pct列で競合が発生した場合にコールされる競合ハンドラが設定されます。このような競合が発生した場合は、競合を解消するためにsalary列が評価されます。 job_id列など、列リストにない列でのみ競合が発生した場合、この競合ハンドラはコールされません。


SET_VALUE_DEPENDENCYプロシージャ

値の依存性を設定または削除します。値の依存性とは、複数の表の列間の関係を規定する仮想的な依存性の定義です。

適用プロセスでは、値の依存性の名前を使用して、値の依存性に定義されている列が含まれている行論理変更レコード(行LCR)間の依存性を検出します。値の依存性には、表間の仮想的な外部キー関係を定義できますが、外部キー関係とは異なり、複数のデータベース・オブジェクトを含めることができます。

このプロシージャはオーバーロードされています。 attribute_listパラメータとattribute_tableパラメータは、両方同時には指定できません。


関連項目:

『Oracle Streamsレプリケーション管理者ガイド』

構文

DBMS_APPLY_ADM.SET_VALUE_DEPENDENCY(
   dependency_name IN VARCHAR2,
   object_name     IN VARCHAR2,
   attribute_list  IN VARCHAR2);

DBMS_APPLY_ADM.SET_VALUE_DEPENDENCY(
   dependency_name IN VARCHAR2,
   object_name     IN VARCHAR2,
   attribute_table IN DBMS_UTILITY.NAME_ARRAY);

パラメータ

表20-23 SET_VALUE_DEPENDENCYプロシージャのパラメータ

パラメータ 説明

dependency_name

値の依存性の名前。

指定した名前の依存性が存在しない場合は、作成されます。

指定した名前の依存性が存在する場合は、指定したオブジェクトおよび属性がその依存性に追加されます。

NULLに設定すると、エラーが発生します。

object_name

表の名前。[schema_name.]table_nameの形式で指定します。たとえば、hr.employeesのように指定します。スキーマを指定しない場合は、現行のユーザー名がデフォルトで使用されます。

NULLに設定して、指定した依存性が存在する場合、その依存性は削除されます。NULLに設定して、指定した依存性が存在しない場合、エラーが発生します。

NULLに設定すると、attribute_listおよびattribute_tableNULLにする必要があります。

attribute_list

表内の列名のカンマ区切りリスト。エントリ間に空白を挿入しないでください。

attribute_table

表内の列名が含まれているDBMS_UTILITY.NAME_ARRAYタイプのPL/SQL索引付き表。最初の列名は位置1、2番目は位置2、以降同様に設定されている必要があります。表の最後をNULLにする必要はありません。



START_APPLYプロシージャ

このプロシージャでは、適用プロセスにメッセージの適用開始を指示します。

構文

DBMS_APPLY_ADM.START_APPLY(
   apply_name  IN  VARCHAR2);

パラメータ

表20-24 START_APPLYプロシージャのパラメータ

パラメータ 説明

apply_name

適用プロセス名。NULLを設定することはできません。所有者を指定しないでください。


使用上の注意

適用プロセスのステータスは永続的に記録されます。したがって、ステータスがENABLEDの場合、適用プロセスはデータベース・インスタンスの起動時に開始されます。適用プロセス(annn)は、Oracleバックグラウンド・プロセスです。 DBMS_AQADM.START_QUEUEおよびDBMS_AQADM.STOP_QUEUEのエンキューとデキューの状態は、適用プロセスの開始ステータスには影響を与えません。


STOP_APPLYプロシージャ

このプロシージャでは、適用プロセスによるメッセージの適用を停止し、適用が終了していないトランザクションをロールバックします。

構文

DBMS_APPLY_ADM.STOP_APPLY(
   apply_name  IN  VARCHAR2,
   force       IN  BOOLEAN   DEFAULT FALSE);

パラメータ

表20-25 STOP_APPLYプロシージャのパラメータ

パラメータ 説明

apply_name

適用プロセス名。NULLを設定することはできません。所有者を指定しないでください。

force

TRUEに設定すると、適用プロセスは可能なかぎり早く停止されます。

FALSEに設定すると、適用された一連のトランザクションに不整合のないことが確認された後で、適用プロセスが停止されます。

適用プロセスの動作は、forceパラメータに指定された設定、およびcommit_serialization適用プロセス・パラメータに指定された設定によって決まります。詳細は、「使用上の注意」を参照してください。


使用上の注意

適用プロセスのステータスは永続的に記録されます。したがって、ステータスがDISABLEDまたはABORTEDの場合、適用プロセスはデータベース・インスタンスの起動時に開始されません。

DBMS_AQADM.START_QUEUEおよびDBMS_AQADM.STOP_QUEUEのエンキューとデキューの状態は、適用プロセスのSTOPステータスには影響を与えません。

次の表では、STOP_APPLYプロシージャのforceパラメータ、およびcommit_serialization適用プロセス・パラメータの各設定に対する適用プロセスの動作を説明します。すべての場合で、停止時に、適用プロセスは未完了のトランザクションをロールバックします。

force commit_serialization 適用プロセスの動作
TRUE full 適用プロセスは即時に停止され、未完了のトランザクションは適用されません。
TRUE なし 適用プロセスの停止時に、ローカルで適用済の一部のトランザクションが、ローカルで適用されていない一部のトランザクションより、時間的に遅れてソース・データベースでコミットされる場合があります。
FALSE full 適用プロセスは、コミット順で次のコミットされていないトランザクションが処理中の場合、そのトランザクションを適用した後で停止します。
FALSE なし 停止する前に、適用プロセスは、コミット・タイムが最新の適用済トランザクションより早いコミット・タイムを持つトランザクションをすべて適用します。

たとえば、commit_serialization適用プロセス・パラメータがnoneに設定されていて、コミット・タイムが最も早いトランザクション1、トランザクション1の後にコミットされたトランザクション2、およびコミット・タイムが最も遅いトランザクション3の3つのトランザクションがあるとします。 また、STOP_APPLYプロシージャの実行時に、適用プロセスはトランザクション1とトランザクション3を適用済で、トランザクション2の適用処理中であるとします。この例では、forceパラメータがTRUEに設定されていると、トランザクション2は適用されず、適用プロセスは停止します(トランザクション2はロールバックされます)。ただし、forceパラメータがFALSEに設定されていると、トランザクション2は、適用プロセスが停止する前に適用されます。

commit_serialization適用プロセス・パラメータがfullに設定されている別の例では、次のようになります。 たとえば、commit_serialization適用プロセス・パラメータがfullに設定されていて、コミット・タイムが最も早いトランザクションA、トランザクションAの後にコミットされたトランザクションB、およびコミット・タイムが最も遅いトランザクションCの3つのトランザクションがあるとします。 この場合、STOP_APPLYプロシージャの実行時に、適用プロセスはトランザクションAを適用済で、トランザクションBとCの適用処理中であるとします。この例では、forceパラメータがTRUEに設定されていると、トランザクションBとCは適用されず、適用プロセスは停止します(トランザクションBとCはロールバックされます)。ただし、forceパラメータがFALSEに設定されていると、トランザクションBは適用プロセスが停止する前に適用され、トランザクションCはロールバックされます。


関連項目:

commit_serialization適用プロセス・パラメータの詳細は、「SET_PARAMETERプロシージャ」を参照してください。