DBMS_APPLY_ADMパッケージは、一連のStreamsパッケージの1つで、適用プロセスを開始、停止および構成するサブプログラムを提供します。 このパッケージには、適用ハンドラの構成、メッセージのエンキュー先の設定、メッセージの実行ディレクティブの指定を行うサブプログラムが含まれます。 また、このパッケージは、接続先データベースのオブジェクトにインスタンス化SCNを設定する管理サブプログラムも提供します。 さらには、適用エラーを管理するサブプログラムもあります。
|
関連項目: このパッケージおよび適用プロセスの詳細は、『Oracle Streams概要および管理』および『Oracle Streamsレプリケーション管理者ガイド』を参照してください。 |
この章では、次の項目について説明します。
表15-1 DBMS_APPLY_ADMパッケージのサブプログラム
| サブプログラム | 説明 |
|---|---|
|
|
適用プロセスを変更します。 |
|
|
適用時に、行論理変更レコード(行LCR)内に存在する1つ以上の列の元の値を、宛先サイトの対応する列の現在の値と比較するかどうかを指定します。 |
|
|
適用プロセスを作成します。 |
|
CREATE_OBJECT_DEPENDENCYプロシージャ |
オブジェクトの依存性を作成します。 |
|
|
指定した適用プロセスに対するすべてのエラー・トランザクションを削除します。 |
|
|
指定したエラー・トランザクションを削除します。 |
|
|
適用プロセスを削除します。 |
|
|
オブジェクトの依存性を削除します。 |
|
|
指定した適用プロセスに対するエラー・トランザクションを再実行します。 |
|
|
指定したエラー・トランザクションを再実行します。 |
|
|
指定したメッセージ番号とトランザクション識別子に対するメッセージ・ペイロードをエラー・キューから返します。 |
|
|
指定した適用プロセスを使用する指定オブジェクトに対する操作オプションを変更します。 |
|
|
指定したルールを満たすメッセージが適用プロセスによって自動的にエンキューされるキューを設定します。 |
|
|
指定したルールを満たすメッセージを適用プロセスによって実行するかどうかを指定します。 |
|
SET_GLOBAL_INSTANTIATION_SCNプロシージャ |
指定したソース・データベースに対して、およびオプションで、ソース・データベースのスキーマとそのスキーマが所有する表に対して、指定したインスタンス化SCNを記録します。 |
|
|
ローカル適用の目的で代替主キーとして使用される列セットを記録し、指定オブジェクトに対する既存の代替主キー列が存在する場合は、それを削除します。 |
|
|
適用パラメータを指定した値に設定します。 |
|
SET_SCHEMA_INSTANTIATION_SCNプロシージャ |
指定したソース・データベース内の指定のスキーマに対して、およびオプションで、ソース・データベースのスキーマが所有する表に対して、指定したインスタンス化SCNを記録します。 |
|
SET_TABLE_INSTANTIATION_SCNプロシージャ |
指定したソース・データベース内の指定表に対する指定インスタンス化SCNを記録します。 |
|
SET_UPDATE_CONFLICT_HANDLERプロシージャ |
指定オブジェクトに対する更新競合ハンドラを追加、更新または削除します。 |
|
|
値の依存性を設定または削除します。 |
|
|
適用プロセスにメッセージの適用開始を指示します。 |
|
|
適用プロセスを停止してメッセージの適用を中断し、適用が終了していないトランザクションをロールバックします。 |
|
注意: 特に指定がないかぎり、すべてのプロシージャがコミットされます。 ただし、GET_ERROR_MESSAGEファンクションはコミットされません。 |
このプロシージャでは、適用プロセスを変更します。
構文
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);
パラメータ
表15-2 ALTER_APPLYプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
変更する適用プロセスの名前。 既存の適用プロセス名を指定する必要があります。 所有者を指定しないでください。 |
|
|
適用プロセスのポジティブ・ルール・セットの名前。 ポジティブ・ルール・セットには、適用プロセスにメッセージの適用を指示するルールが含まれます。 適用プロセスに対してポジティブ・ルール・セットを使用する場合は、既存のルール・セットを 指定したルール・セットが存在しない場合は、エラーが戻されます。 ルール・セットを作成し、そのルール・セットにルールを追加するには、
|
|
|
適用プロセスのポジティブ・ルール・セットを削除し、適用プロセスのネガティブ・ルール・セットが存在する場合、適用プロセスは、ネガティブ・ルール・セットによって廃棄されないキュー内のすべてのメッセージをデキューします。
|
|
|
適用プロセスに対する、キュー内の非LCRメッセージを処理するユーザー定義プロシージャ。 メッセージ・ハンドラ・プロシージャの詳細は、「CREATE_APPLYプロシージャ」の「使用上の注意」を参照してください。 |
|
|
|
|
|
適用プロセスに対する、キュー内のDDL論理変更レコード(DDL LCR)を処理するユーザー定義プロシージャ。 適用されたDDL LCRはすべて自動的にコミットします。 したがって、DDLハンドラが、DDL LCRの DDLハンドラ・プロシージャの詳細は、「CREATE_APPLYプロシージャ」の「使用上の注意」を参照してください。 |
|
|
|
|
|
ユーザーを指定します。このユーザーのセキュリティ・ドメイン内で、適用プロセスは、適用プロセスのルール・セットを満足するメッセージをデキューし、データベース・オブジェクトにメッセージを直接適用し、適用プロセス・ルールに対して構成されているカスタム・ルールベースの変換を実行し、適用プロセスに対して構成されている適用ハンドラを実行します。
適用ユーザーを変更すると、このプロシージャは、適用プロセスで使用されるキューのデキュー権限を新しい適用ユーザーに付与し、そのユーザーをキューの保護キュー・ユーザーとして構成します。 適用ユーザーには、このプロシージャによって付与される権限の他に、次の権限も付与する必要があります。
これらの権限は、適用ユーザーに直接付与する必要があります。 ロールを通して付与することはできません。 デフォルトでは、このパラメータは、このパッケージの 注意: 指定したユーザーが |
|
|
指定した適用プロセスによって生成されたREDOエントリに追加されるバイナリ・タグ。 タグは、LCRの追跡に使用できるバイナリ値です。 タグは、適用プロセスを実行しているデータベースの取得プロセスが、適用プロセスによって加えられた変更を取得した場合にのみ関係します。 この場合、取得した変更に、このパラメータで指定されたタグが含まれます。
次は、16進値
関連項目: タグの詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。 |
|
|
|
|
|
適用プロセスのキュー内の内部コミット・ディレクティブを適用プロセスによって処理される前に受け取ることができるユーザー定義のプロシージャ。 通常は、適用プロセスによって処理されるトランザクションのコミット情報を監査するために、プリコミット・ハンドラを使用します。 内部コミット・ディレクティブは、次のようにエンキューされます。
取得された行LCRの場合、コミット・ディレクティブにソース・データベースからのトランザクションのコミットSCNが含まれます。 ユーザーによってエンキューされたメッセージの場合、コミットSCNは適用プロセスによって生成されます。 プリコミット・ハンドラ・プロシージャでは、次の制限に従ってください。
プリコミット・ハンドラで例外が発生した場合は、適用トランザクション全体がロールバックされ、トランザクション内のすべてのメッセージがエラー・キューに移動されます。 プリコミット・ハンドラ・プロシージャの詳細は、「CREATE_APPLYプロシージャ」の「使用上の注意」を参照してください。 |
|
|
|
|
|
適用プロセスのネガティブ・ルール・セットの名前。 ネガティブ・ルール・セットには、適用プロセスにメッセージの廃棄を指示するルールが含まれます。 適用プロセスに対してネガティブ・ルール・セットを使用する場合は、既存のルール・セットを 指定したルール・セットが存在しない場合は、エラーが戻されます。 ルール・セットを作成し、そのルール・セットにルールを追加するには、
適用プロセスに対してポジティブ・ルール・セットとネガティブ・ルール・セットの両方を指定した場合は、ネガティブ・ルール・セットが常に最初に評価されます。 |
|
|
適用プロセスのネガティブ・ルール・セットを削除し、適用プロセスのポジティブ・ルール・セットが存在する場合、適用プロセスは、ポジティブ・ルール・セットによって廃棄されないキュー内のすべてのメッセージをデキューします。
|
使用上の注意
適用プロセスは、次に示すALTER_APPLYプロシージャのパラメータ値を1つ以上変更すると、自動的に停止および再開します。
message_handler
ddl_handler
apply_user
apply_tag
precommit_handler
このプロシージャでは、適用時に、行論理変更レコード(行LCR)内にある1つ以上の列の元の値を、宛先サイトの対応する列の現在の値と比較するかどうかを指定します。 このプロシージャで実行するのは、UPDATEおよびDELETE関連の操作のみです。これらの操作によってのみ、行LCRに元の列値が入るためです。 デフォルトでは、すべての列の元の値が比較されます。
このプロシージャはオーバーロードされています。 column_listパラメータとcolumn_tableパラメータは、両方同時には指定できません。
|
関連項目: 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);
パラメータ
表15-3 COMPARE_OLD_VALUESプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
ソース表の名前。 |
|
|
表内の列名のカンマ区切りリスト。 エントリ間に空白を挿入しないでください。 すべての非キー列を指定する場合は、この値を |
|
|
表内の列名が含まれている |
|
|
操作名。次の操作名を指定できます。
|
|
|
|
|
|
Oracle以外のデータベースへのデータベース・リンクの名前。 このパラメータは、接続先データベースがOracle以外のデータベースの場合にのみ設定する必要があります。 |
使用上の注意
デフォルトでは、適用プロセスは行LCRの元の列値を使用して競合を検出します。 元の列値を比較しないようにすると、特定の表の競合を検出しないようにできます。 たとえば、時刻列を使用して競合を検出する場合、非キー列および時刻以外の列については、適用プロセスによるチェックは必要ありません。
|
注意: 適用プロセスでは、行LCRにキー列の元の値が存在する場合、常に比較します。column_listまたはcolumn_tableにキー列が指定されていてcompareパラメータがFALSEに設定されている場合は、エラーが発生します。 |
このプロシージャでは、適用プロセスを作成します。
|
注意: このプロシージャを実行するユーザーには、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);
パラメータ
表15-4 CREATE_APPLYプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
適用プロセスがメッセージをデキューするキュー名。 既存のキューを 注意: |
|
|
作成する適用プロセスの名前。 また、既存の適用プロセス名やメッセージ・クライアント名と同じ名前を指定しないでください。 注意: |
|
|
適用プロセスのポジティブ・ルール・セットの名前。 ポジティブ・ルール・セットには、適用プロセスにメッセージの適用を指示するルールが含まれます。 適用プロセスに対してポジティブ・ルール・セットを使用する場合は、既存のルール・セットを
指定したルール・セットが存在しない場合は、エラーが戻されます。 ルール・セットを作成し、そのルール・セットにルールを追加するには、 |
|
|
適用プロセスに対する、キュー内の非LCRメッセージを処理するユーザー定義プロシージャ。 メッセージ・ハンドラ・プロシージャの詳細は、「使用上の注意」を参照してください。 |
|
|
適用プロセスに対する、キュー内のDDL論理変更レコード(DDL LCR)を処理するユーザー定義プロシージャ。 適用されたDDL LCRはすべて自動的にコミットします。 したがって、DDLハンドラが、DDL LCRの DDLハンドラ・プロシージャの詳細は、「使用上の注意」を参照してください。 |
|
|
適用プロセス・ルール・セットを満足するDML変更とDDL変更をすべて適用し、ユーザー定義の適用ハンドラを実行するユーザー。 適用ユーザーを設定できるのは、 適用ユーザーとは、そのユーザーのセキュリティ・ドメイン内で、適用プロセスが、適用プロセスのルール・セットを満足するメッセージをデキューし、データベース・オブジェクトにメッセージを直接適用し、適用プロセス・ルールに対して構成されているカスタム・ルールベースの変換を実行し、適用プロセスに対して構成されている適用ハンドラを実行するユーザーのことです。 このユーザーには、変更を適用できる権限が必要です。 このプロシージャでは、適用プロセスで使用されるキューのデキュー権限を適用ユーザーに付与し、そのユーザーをキューの保護キュー・ユーザーとして構成します。 適用ユーザーには、このプロシージャによって付与される権限の他に、次の権限も付与する必要があります。
これらの権限は、適用ユーザーに直接付与する必要があります。 ロールを通して付与することはできません。 注意: 指定したユーザーが |
|
|
適用プロセスがメッセージを適用するデータベース。 このパラメータは、Oracleからオラクル以外のシステム(例: Sybase)に変更を適用するときに使用されます。 ローカル・データベースでメッセージを適用するように指定するには、このパラメータを 注意: |
|
|
指定した適用プロセスによって生成されたREDOエントリに追加されるバイナリ・タグ。 タグは、LCRの追跡に使用できるバイナリ値です。 タグは、適用プロセスを実行しているデータベースの取得プロセスが、適用プロセスによって加えられた変更を取得した場合にのみ関係します。 この場合、取得した変更に、このパラメータで指定されたタグが含まれます。 デフォルトでは、適用プロセスに対するタグは、 次は、16進値
HEXTORAW('17')
関連項目: タグの詳細は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。 |
|
|
キュー内にある、取得されたメッセージとユーザーがエンキューしたメッセージの両方を適用するには、少なくとも2つの適用プロセスを作成する必要があります。 注意: 関連項目: 取得済のメッセージまたはユーザーがエンキューしたメッセージを適用プロセスによって処理する方法の詳細は、『Oracle Streams概要および管理』を参照してください。 |
|
|
適用プロセスのキュー内の内部コミット・ディレクティブを適用プロセスによって処理される前に受け取ることができるユーザー定義のプロシージャ。 通常は、適用プロセスによって処理されるトランザクションのコミット情報を監査するために、プリコミット・ハンドラを使用します。 内部コミット・ディレクティブは、次のようにエンキューされます。
取得された行LCRの場合、コミット・ディレクティブにソース・データベースからのトランザクションのコミットSCNが含まれます。 ユーザーによってエンキューされたメッセージの場合、コミットSCNは適用プロセスによって生成されます。 プリコミット・ハンドラ・プロシージャでは、次の制限に従ってください。
プリコミット・ハンドラで例外が発生した場合は、適用トランザクション全体がロールバックされ、トランザクション内のすべてのメッセージがエラー・キューに移動されます。 プリコミット・ハンドラ・プロシージャの詳細は、「使用上の注意」を参照してください。 |
|
|
適用プロセスのネガティブ・ルール・セットの名前。 ネガティブ・ルール・セットには、適用プロセスにメッセージの廃棄を指示するルールが含まれます。 適用プロセスに対してネガティブ・ルール・セットを使用する場合は、既存のルール・セットを
指定したルール・セットが存在しない場合は、エラーが戻されます。 ルール・セットを作成し、そのルール・セットにルールを追加するには、 適用プロセスに対してポジティブ・ルール・セットとネガティブ・ルール・セットの両方を指定した場合は、ネガティブ・ルール・セットが常に最初に評価されます。 |
|
|
適用プロセスによって適用される変更のソース・データベースのグローバル名。 ソース・データベースは、変更が発生したデータベースです。 取得メッセージを適用する場合、適用プロセスによって適用できるのは、1つのソース・データベースでの1つの取得プロセスによるメッセージのみです。
ドメイン名を指定しない場合は、自動的にドメイン名がデータベース名に追加されます。 たとえば、ドメイン名が 適用プロセス・ルール・セットのルールによって、適用プロセスがデキューするメッセージが決まります。 適用プロセスのソース・データベースとは異なるソース・データベースで、適用プロセスによるLCRのデキューを行うと、エラーが発生します。 適用プロセスのソース・データベースを特定する場合は、 |
使用上の注意
次の各項では、このプロシージャの使用上の注意について説明します。
ハンドラ・プロシージャの名前
message_handler、ddl_handlerおよびprecommit_handlerパラメータの場合は、既存のプロシージャを、次のいずれかの形式で指定します。
[schema_name.]procedure_name
[schema_name.]package_name.procedure_name
プロシージャがパッケージ内にある場合は、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にカプセル化したものです。
プリコミット・ハンドラ・プロシージャ
precommit_handlerパラメータに指定するプロシージャには、次の署名が必要です。
PROCEDURE handler_procedure ( parameter_name IN NUMBER);
handler_procedureはプロシージャ名、parameter_nameはプロシージャに渡されるパラメータ名を表します。 プロシージャに渡すパラメータは、コミット・ディレクティブのコミットSCNです。
このプロシージャでは、オブジェクトの依存性を作成します。 オブジェクトの依存性とは、接続先データベースにある2つのオブジェクト間の親子関係を規定する仮想的な依存性の定義です。
適用プロセスでは、親オブジェクトが含まれている、コミット・システム変更番号(コミットSCN)が小さいすべてのトランザクションがコミットされた後に、子オブジェクトが含まれているトランザクションが実行されるようにスケジュールされます。 適用プロセスでは、依存性の検出に、論理変更レコード(LCR)内のオブジェクトのオブジェクト識別子が使用されます。 依存性の検出に、LCRの列値は使用されません。
|
注意: このプロシージャのいずれかのパラメータに対してNULLを指定すると、エラーが発生します。 |
構文
DBMS_APPLY_ADM.CREATE_OBJECT_DEPENDENCY(
object_name IN VARCHAR2,
parent_object_name IN VARCHAR2);
パラメータ
表15-5 CREATE_OBJECT_DEPENDENCYプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
子データベース・オブジェクトの名前。 |
|
|
親データベース・オブジェクトの名前。 |
このプロシージャでは、指定した適用プロセスに対するすべてのエラー・トランザクションを削除します。
構文
DBMS_APPLY_ADM.DELETE_ALL_ERRORS( apply_name IN VARCHAR2 DEFAULT NULL);
パラメータ
表15-6 DELETE_ALL_ERRORSプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
トランザクション処理時にエラーが発生した適用プロセスの名前。 所有者を指定しないでください。
|
このプロシージャでは、指定したエラー・トランザクションを削除します。
構文
DBMS_APPLY_ADM.DELETE_ERROR( local_transaction_id IN VARCHAR2);
パラメータ
表15-7 DELETE_ERRORプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
削除するエラー・トランザクションの識別番号。 指定したトランザクションがエラー・キューに存在しない場合は、エラーが発生します。 |
このプロシージャでは、適用プロセスを削除します。
構文
DBMS_APPLY_ADM.DROP_APPLY(
apply_name IN VARCHAR2,
drop_unused_rule_sets IN BOOLEAN DEFAULT FALSE);
パラメータ
表15-8 DROP_APPLYプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
削除する適用プロセスの名前。 既存の適用プロセス名を指定する必要があります。 所有者を指定しないでください。 |
|
|
|
使用上の注意
このプロシージャを使用して適用プロセスを削除すると、その適用プロセスに対してDBMS_STREAMS_ADMで作成したルールに関する情報は、Streamsルールのデータ・ディクショナリ・ビューから削除されます。 このルールに関する情報は、このルールが適用プロセスのポジティブ・ルール・セットとネガティブ・ルール・セットのいずれにも含まれていない場合でも削除されます。 Streamsルールのデータ・ディクショナリ・ビューは次のとおりです。
ALL_STREAMS_GLOBAL_RULES
DBA_STREAMS_GLOBAL_RULES
ALL_STREAMS_MESSAGE_RULES
DBA_STREAMS_MESSAGE_RULES
ALL_STREAMS_SCHEMA_RULES
DBA_STREAMS_SCHEMA_RULES
ALL_STREAMS_TABLE_RULES
DBA_STREAMS_TABLE_RULES
|
関連項目: Streamsデータ・ディクショナリ・ビューの詳細は、『Oracle Streams概要および管理』を参照してください。 |
このプロシージャでは、オブジェクトの依存性を削除します。 オブジェクトの依存性とは、接続先データベースにある2つのオブジェクト間の親子関係を規定する仮想的な依存性の定義です。
|
注意:
|
構文
DBMS_APPLY_ADM.DROP_OBJECT_DEPENDENCY(
object_name IN VARCHAR2,
parent_object_name IN VARCHAR2);
パラメータ
表15-9 DROP_OBJECT_DEPENDENCYプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
子データベース・オブジェクトの名前。 |
|
|
親データベース・オブジェクトの名前。 |
このプロシージャでは、指定した適用プロセスのエラー・キュー内のエラー・トランザクションを再実行します。
トランザクションは、コミットSCN順に再実行されます。 エラーが発生すると、エラーの再実行を停止します。
|
関連項目: エラー・キューの詳細は、『Oracle Streams概要および管理』を参照してください。 |
構文
DBMS_APPLY_ADM.EXECUTE_ALL_ERRORS( apply_name IN VARCHAR2 DEFAULT NULL, execute_as_user IN BOOLEAN DEFAULT FALSE);
パラメータ
表15-10 EXECUTE_ALL_ERRORSプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
トランザクション処理時にエラーが発生した適用プロセスの名前。 所有者を指定しないでください。
|
|
|
トランザクションを実行するユーザーには、適用オブジェクトに対してDML変更とDDL変更を実行する権限、および適用ハンドラを実行する権限が必要です。 また、適用プロセスで使用されるキューに対するデキュー権限も必要です。 |
このプロシージャでは、エラー・キュー内の指定したエラー・トランザクションを再実行します。
|
関連項目: エラー・キューの詳細は、『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);
パラメータ
表15-11 EXECUTE_ERRORプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
実行するエラー・トランザクションの識別番号。 指定したトランザクションがエラー・キューに存在しない場合は、エラーが発生します。 |
|
|
トランザクションを実行するユーザーには、適用オブジェクトに対してDML変更とDDL変更を実行する権限、および適用ハンドラを実行する権限が必要です。 また、適用プロセスで使用されるキューに対するデキュー権限も必要です。 |
|
|
エラー・トランザクションを正しく実行できるように変更するユーザー定義プロシージャ。
関連項目: ユーザー・プロシージャの詳細は、「使用上の注意」を参照してください。 |
使用上の注意
user_procedureパラメータには、完全なプロシージャ名を次のいずれかの形式で指定する必要があります。
[schema_name.]package_name.procedure_name
[schema_name.]procedure_name
プロシージャがパッケージ内にある場合は、package_nameを指定する必要があります。 EXECUTE_ERRORプロシージャを起動するユーザーには、指定したプロシージャのEXECUTE権限が必要です。 また、schema_nameを指定しない場合は、EXECUTE_ERRORプロシージャを起動するユーザー名がデフォルトで使用されます。
たとえば、procedure_nameのプロパティが次のとおりであるとします。
schema_nameはstrmadminです。
package_nameはfix_errorsです。
procedure_nameはfix_hr_errorsです。
この場合、次のように指定します。
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);
ユーザー・プロシージャには、次のパラメータがあります。
in_anydata: 適用プロセスによってプロシージャに渡されるメッセージをANYDATAにカプセル化したもの。 1つのトランザクションに複数のメッセージを含めることができます。 行論理変更レコード(行LCR)、DDL論理変更レコード(DDL LCR)またはユーザー・メッセージをメッセージにできます。
error_record: トランザクションを識別するDBA_APPLY_ERRORデータ・ディクショナリ・ビューの行。
error_message_number: in_anydataパラメータのANYDATAオブジェクトのメッセージ番号。1から始まります。
messaging_default_processing: TRUEに設定すると、適用プロセスはin_anydataパラメータのメッセージの処理(DML文またはDDL文の実行、適用ハンドラの起動など)を続行します。
FALSEに設定すると、適用プロセスはin_anydataパラメータのメッセージの処理をスキップし、in_anydataパラメータの次のメッセージに移ります。
out_anydata: messaging_default_processingがTRUEの場合にユーザー・プロシージャで処理され、適用プロセスで使用されるANYDATAオブジェクト。
LCRをユーザー・プロシージャ内のEXECUTE LCRメンバー・プロシージャを使用して実行すると、このLCRは直接実行されるため、messaging_default_processingをFALSEに設定する必要があります。 この場合、LCRは適用ハンドラに渡されません。
ユーザー・プロシージャでエラー・トランザクションを処理すると、次のいずれかの結果になります。
ユーザー・プロシージャによって、正しく実行できるようにトランザクションが変更される。
必要な変更をユーザー・プロシージャで実行できなかったため、トランザクションを実行しようとするとエラーが発生する。 この場合、トランザクションは、ロールバックされ、エラー・キューに残ったままになります。
ユーザー・プロシージャには、次の制限事項が適用されます。
COMMIT文またはROLLBACK文を実行しないでください。 これらの文を実行すると、トランザクションの一貫性が失われる危険性があります。
LCR内のLONG列、LONG RAW列またはLOB列のデータを変更しないでください。
in_anydataパラメータのANYDATAオブジェクトが行LCRで、messaging_default_processingパラメータがTRUEに設定されている場合、out_anydataパラメータは行LCRである必要があります。
in_anydataパラメータのANYDATAオブジェクトがDDL LCRで、messaging_default_processingパラメータがTRUEに設定されている場合、out_anydataパラメータはDDL LCRである必要があります。
ユーザー・プロシージャを実行するユーザーには、DBA_APPLY_ERRORデータ・ディクショナリ・ビューに対するSELECT権限が必要です。
|
注意: COMMIT、ROLLBACKなどのトランザクション・ディレクティブが含まれているLCRは、ユーザー・プロシージャに渡されません。 |
このファンクションでは、指定したメッセージ番号とトランザクション識別子に対するメッセージ・ペイロードをエラー・キューから返します。 メッセージは、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;
パラメータ
表15-12 GET_ERROR_MESSAGEファンクションのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
メッセージの識別番号。 この番号によって、トランザクション内のメッセージの位置が識別されます。 |
|
|
メッセージを返すエラー・トランザクションの識別子。 |
|
|
メッセージをエンキューするキュー名を指定します。 メッセージをキューにエンキューしない場合は、 |
|
|
メッセージを実行する場合は、 メッセージを実行しない場合は、 |
このプロシージャでは、指定オブジェクトでの指定操作に対する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);
パラメータ
表15-13 SET_DML_HANDLERプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
ソース・オブジェクトの名前。 |
|
|
ソース・オブジェクトのタイプ。 現在、指定できるソース・オブジェクトのタイプは |
|
|
操作名。次の操作名を指定できます。
たとえば、 |
|
|
|
|
|
指定オブジェクトでの指定操作に対する適用時に起動されるユーザー定義プロシージャ。 プロシージャがDMLハンドラの場合は、Oracleで実行されるデフォルト適用のかわりに起動されます。 プロシージャがエラー・ハンドラの場合は、適用プロセスでエラーが発生したときに起動されます。 指定オブジェクトでの指定操作で起動されるDMLハンドラを設定解除する場合は、 |
|
|
Oracle以外のデータベースへのデータベース・リンクの名前。 このパラメータは、接続先データベースがOracle以外のデータベースの場合にのみ設定する必要があります。 |
|
|
DMLハンドラまたはエラー・ハンドラを使用する適用プロセスの名前。
|
|
|
|
使用上の注意
このプロシージャは、接続先データベースで実行します。 SET_DML_HANDLERプロシージャは、カスタマイズされた適用を使用して、DML変更(行LCR)が含まれる論理変更レコードを適用する方法をユーザーに提供します。
error_handlerパラメータをTRUEに設定すると、ユーザー・プロシージャがエラー・ハンドラとして指定されます。 エラー・ハンドラは、行LCRで適用プロセス・エラーが発生したときに起動されます。 このようなエラーは、競合ハンドラが指定されていないか、または更新競合ハンドラで競合を解消できない場合に、データ競合が原因で発生する可能性があります。 error_handlerをFALSEに設定すると、ユーザー・プロシージャは、エラー・ハンドラではなくDMLハンドラとして指定され、指定オブジェクトで指定操作を実行するかわりに、DMLハンドラが常に実行されます。
このプロシージャは、オブジェクトでの特定操作に対して、DMLハンドラまたはエラー・ハンドラのいずれかを設定します。 同じオブジェクトと操作に対してDMLハンドラとエラー・ハンドラの両方は設定できません。
apply_nameパラメータがNULL以外の場合は、指定した適用プロセスにDMLハンドラまたはエラー・ハンドラが設定されます。 この場合、設定されたハンドラは、ローカルの接続先データベースで他の適用プロセスに対して起動されません。 apply_nameパラメータがNULL(デフォルト)の場合は、接続先データベースのすべての適用プロセスに対する汎用ハンドラとして、ハンドラが設定されます。 特定の適用プロセスに対して設定された場合のハンドラは、すべての汎用ハンドラに優先します。 たとえば、次の状況を想定します。
hr.employees表のUPDATE操作のapply_hrという適用プロセスに対して、handler_hrというDMLハンドラを指定します。
hr.employees表のUPDATE操作には、handler_genという汎用DMLハンドラも存在します。
この場合、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パラメータに完全なプロシージャ名を指定する必要があります。
[schema_name.]package_name.procedure_name
[schema_name.]procedure_name
プロシージャがパッケージ内にある場合は、package_nameを指定する必要があります。 SET_DML_HANDLERプロシージャを起動するユーザーには、指定したプロシージャのEXECUTE権限が必要です。 また、schema_nameを指定しない場合は、SET_DML_HANDLERプロシージャの起動ユーザー名がデフォルトで使用されます。
たとえば、procedure_nameのプロパティが次のとおりであるとします。
schema_nameはhrです。
package_nameはapply_pkgです。
procedure_nameはemployees_defaultです。
この場合、次のように指定します。
hr.apply_pkg.employees_default
ユーザー・プロシージャには、次の制限事項が適用されます。
COMMIT文またはROLLBACK文を実行しないでください。 これらの文を実行すると、LCRが含まれるトランザクションの一貫性が失われる危険性があります。
行LCRに対してEXECUTEメンバー・プロシージャを使用して行を操作している場合は、行操作で複数行を操作しないでください。 複数行を操作するDML文は、手動で構成および実行する必要があります。
コマンド・タイプがUPDATEまたはDELETEの場合、LCRに対してEXECUTEメンバー・プロシージャを使用して再実行される行操作では、以前の値リストにキー全体が含まれている必要があります。 SET_KEY_COLUMNSプロシージャで代替キーが指定されていないかぎり、キーは主キーであるか、少なくとも1つのNOT NULL列を持つ一意の最小の索引になります。 キーを指定しない場合は、LOB列、LONG列およびLONG RAW列以外のすべての列によってキーが構成されます。
コマンド・タイプがINSERTの場合、LCRに対してEXECUTEメンバー・プロシージャを使用して再実行される行操作では、新規の値リストにキー全体が含まれている必要があります。 キー全体が組み込まれていない場合は、行が重複する可能性があります。 SET_KEY_COLUMNSプロシージャで代替キーが指定されていないかぎり、キーは主キーであるか、少なくとも1つのNOT NULL列を持つ一意の最小の索引になります。 キーを指定しない場合は、LOB列、LONG列およびLONG RAW列以外のすべての列によってキーが構成されます。
|
関連項目: DMLハンドラおよびデータ型(LOB、LONG、LONG RAW)の詳細と制限は、『Oracle Streamsレプリケーション管理者ガイド』を参照してください。 |
user_procedureパラメータに指定されるプロシージャには、次の署名が必要です。
PROCEDURE user_procedure ( parameter_name IN ANYDATA);
user_procedureはプロシージャ名、parameter_nameはプロシージャに渡されるパラメータ名を表します。 プロシージャに渡されるパラメータは、行LCRをANYDATAにカプセル化したものです。
エラー処理用に作成するプロシージャには、次の署名が必要です。
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)を使用します。
|
注意:
|
エラー・ハンドラを実行すると、次のいずれかの結果になります。
エラー・ハンドラがエラーを正常に解決し、適用プロセスに制御を戻します。
エラー・ハンドラがエラーを解決できず、エラーが発生します。 エラーが発生すると、トランザクションはロールバックされ、エラー・キューに入れられます。
このプロシージャでは、指定したルールを満たすメッセージが適用プロセスによって自動的にエンキューされるキューを設定します。
このプロシージャによって、指定したルールのアクション・コンテキストを変更し、キューを指定します。 ルールのアクション・コンテキストは、ルールがメッセージに対してTRUEに評価された後、ルール・エンジンのクライアントが解析するルールに関連付けられているオプションの情報です。 この場合、ルール・エンジンのクライアントはStreams適用プロセスです。 アクション・コンテキスト内の情報はSYS.RE$NV_LISTタイプのオブジェクトであり、名前/値ペアで構成されています。
このプロシージャで指定するキューの宛先は、アクション・コンテキスト内の次の名前/値ペアで常に構成されます。
名前は、APPLY$_ENQUEUEです。
値は、VARCHAR2として指定されたキュー名を格納するANYDATAインスタンスです。
構文
DBMS_APPLY_ADM.SET_ENQUEUE_DESTINATION( rule_name IN VARCHAR2, destination_queue_name IN VARCHAR2);
パラメータ
表15-14 SET_ENQUEUE_DESTINATIONプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
ルールの名前。 |
|
|
適用プロセスがメッセージをエンキューするキューの名前。 たとえば、
|
使用上の注意
DMLハンドラ、DDLハンドラ、メッセージ・ハンドラなどの適用ハンドラは、宛先キューにもエンキューされるメッセージを処理する場合、そのメッセージがエンキューされる前に処理します。
このプロシージャを使用する場合は、次の点に注意してください。
このプロシージャでは、指定したキューが存在するかどうかを確認しません。 キューが存在しない場合、適用プロセスがメッセージをエンキューしようとするとエラーが発生します。
Streamsの取得プロセス、伝播、メッセージ・クライアントは、このプロシージャによって作成されるアクション・コンテキストを無視します。
指定したルールを使用する適用プロセスの適用ユーザーには、指定したキューにメッセージをエンキューできる権限が必要です。 キューが保護キューの場合、適用ユーザーはキューの保護キュー・ユーザーである必要があります。
指定したルールは、適用プロセスのポジティブ・ルール・セットである必要があります。 ルールが適用プロセスのネガティブ・ルール・セットに含まれる場合、適用プロセスはメッセージを宛先キューにエンキューしません。
メッセージのコミットSCNがメッセージの関連インスタンス化SCN以下の場合、そのメッセージは、適用プロセス・ルール・セットを満たしている場合でも、宛先キューにエンキューされません。
このプロシージャでは、指定したルールを満たすメッセージを適用プロセスによって実行するかどうかを指定します。
このプロシージャによって、指定したルールのアクション・コンテキストを変更し、メッセージの実行を指定します。 ルールのアクション・コンテキストは、ルールがメッセージに対してTRUEに評価された後、ルール・エンジンのクライアントが解析するルールに関連付けられているオプションの情報です。 この場合、ルール・エンジンのクライアントはStreams適用プロセスです。 アクション・コンテキスト内の情報はSYS.RE$NV_LISTタイプのオブジェクトであり、名前/値ペアで構成されています。
このプロシージャで指定するメッセージ実行ディレクティブは、アクション・コンテキスト内の次の名前/値ペアで常に構成されます。
名前は、APPLY$_EXECUTEです。
値は、VARCHAR2としてNOを格納するANYDATAインスタンスです。 値がNOの場合、適用プロセスはメッセージを実行せず、メッセージを適用ハンドラに送りません。
構文
DBMS_APPLY_ADM.SET_EXECUTE( rule_name IN VARCHAR2, execute IN BOOLEAN);
パラメータ
表15-15 SET_EXECUTEプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
ルールの名前。 |
|
|
|
使用上の注意
メッセージが論理変更レコード(LCR)のときにそのメッセージが実行されない場合、関連するローカル・データベース・オブジェクトに対して、LCRにカプセル化された変更は実行されません。 また、メッセージが実行されない場合、そのメッセージは適用ハンドラに送られません。
|
注意:
|
このプロシージャでは、指定したソース・データベースに対して、およびオプションで、ソース・データベースのスキーマとそのスキーマが所有する表に対して、指定したインスタンス化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);
パラメータ
表15-16 SET_GLOBAL_INSTANTIATION_SCNプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
ソース・データベースのグローバル名。 たとえば、 ドメイン名を指定しない場合は、自動的にドメイン名がデータベース名に追加されます。 たとえば、ドメイン名が |
|
|
インスタンス化SCN。 |
|
|
Oracle以外のデータベースへのデータベース・リンクの名前。 このパラメータは、ローカル適用プロセスの接続先データベースがOracle以外のデータベースの場合にのみ設定する必要があります。 |
|
|
注意: |
使用上の注意
ソース・データベースからのデータベース・オブジェクトに対するDDL LCRのコミットSCNが、接続先データベースでそのソース・データベースに対するインスタンス化SCN以下の場合は、接続先データベースでの適用プロセスで、そのDDL LCRは無視されます。 それ以外の場合は、DDL LCRが適用されます。
このプロシージャで指定するグローバル・インスタンス化SCNがDDL LCRに対して使用されるのは、object_owner、base_table_ownerおよびbase_table_nameがDDL LCRに指定されていない場合のみです。 たとえば、このプロシージャによって設定されるグローバル・インスタンス化SCNは、command_typeがCREATE 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が設定されません。
|
注意:
|
このプロシージャでは、適用の目的で代替主キーとして使用される列セットを記録し、指定オブジェクトに対する既存の代替主キー列が存在する場合は、それを削除します。
このプロシージャはオーバーロードされています。 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);
パラメータ
表15-17 SET_KEY_COLUMNSプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
表の名前。 |
|
|
代替主キーとして使用する、表内の列のカンマで区切られたリスト。列名の間に空白は入れません。
|
|
|
代替主キーとして使用する、表内の列の
|
|
|
Oracle以外のデータベースへのデータベース・リンクの名前。 このパラメータは、接続先データベースがOracle以外のデータベースの場合にのみ設定する必要があります。 |
使用上の注意
空でない場合、この列セットは、指定オブジェクトの主キーより優先されます。 オブジェクトにすでに主キー列があり、これらの主キー列をキーとして使用する場合は、代替キー列を指定しないでください。
このプロシージャは、接続先データベースで実行します。 ソース・データベースでは、代替キー列に対して絶対的な補助ログ・グループを指定する必要があります。
|
注意:
|
このプロシージャでは、適用パラメータを指定した値に設定します。
構文
DBMS_APPLY_ADM.SET_PARAMETER ( apply_name IN VARCHAR2, parameter IN VARCHAR2, value IN VARCHAR2);
パラメータ
表15-18 SET_PARAMETERプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
適用プロセス名。 所有者を指定しないでください。 |
|
|
設定するパラメータの名前。 これらのパラメータのリストについては、「適用プロセスのパラメータ」を参照してください。 |
|
|
パラメータに設定する値。 |
適用プロセスのパラメータ
次の表に、適用プロセスのパラメータを示します。
表15-19 適用プロセスのパラメータ
| パラメータ名 | 設定可能な値 | デフォルト | 説明 |
|---|---|---|---|
|
|
|
注意: このパラメータの設定に関係なく、適用プロセスでは、LOB列、 関連項目: 「重複行と代替主キー列」 |
|
|
|
|
適用済トランザクションがコミットされる順序。
適用するトランザクションは、指定に関係なく、データ依存性と制約依存性に従って、パラレルで実行できます。 ロジカル・スタンバイ環境では、通常 |
|
|
|
|
|
|
|
|
|
|
|
|
有効なSCN値または |
|
適用プロセスは、指定された値以上のコミットSCNを持つトランザクションの適用前に無効化されます。
|
|
|
正の整数 |
|
同時に適用可能なトランザクション数。 parallelismパラメータを、使用可能なパラレル実行サーバー数より大きい値に設定すると、適用プロセスが無効になる場合があります。 parallelism適用プロセス・パラメータを設定するときは、 注意: 実行中の適用プロセスに対してこのパラメータの値を変更すると、適用プロセスは自動的に停止し、再開します。 現在適用中のトランザクションのサイズによっては、時間がかかる場合があります。 |
|
|
|
|
同じ適用プロセスの別のインスタンス化が終了するのを待機する最大秒数。 同じ適用プロセスの別のインスタンス化がこの時間内に終了しない場合、適用プロセスは開始しません。
|
|
|
正の整数または |
|
適用プロセスは、開始してから指定秒数が経過した後、可能なかぎり早く停止します。
|
|
|
|
|
Oracleサポート・サービスから指示がないかぎり、このパラメータは設定しないでください。 |
|
|
正の整数または |
|
適用プロセスは、指定した数のトランザクションを適用した後停止します。
|
|
|
正の整数または |
|
メモリー内の特定のトランザクションのメッセージ数が、指定した数を超えると、適用プロセスによって、メモリーからハードディスクへの書出しが開始されます。 メモリーから書き出される最初のチャンクのメッセージの数は、このパラメータに指定した数と同じです。それ以降のチャンクで書き出されるメッセージの数は、100またはこのパラメータに指定した数のいずれか小さいほうと同じになります。 適用プロセスのリーダー・サーバーでは、指定した数のメッセージが特定のトランザクションに対してメモリー内に保持されている場合、そのトランザクションに対する次のメッセージが検出されると、メモリー内のメッセージがハードディスクに書き出されます。 たとえば、パラメータの設定が
適用プロセスは、最初の10,100個のメッセージをハードディスクから適用し、最後の100個のメッセージをメモリーから適用します。 リーダー・サーバーによってメモリーから書き出されたメッセージは、ハードディスク上のデータベース表に格納されます。 これらのメッセージは、メモリーからキュー表へは書き出されません。 メッセージの書出しは、トランザクション単位で行われます。 たとえば、このパラメータの設定が
適用プロセスによって書き出されたトランザクションについては、 注意: 実行中の適用プロセスに対してこのパラメータの値を変更すると、新しい設定は、適用プロセスを再起動するまで有効になりません。 |
|
|
|
|
|
メッセージには、適用プロセスの停止理由が示されます。 |
使用上の注意
パラメータ値を変更したとき、パラメータの新しい値が有効になるまでに時間がかかる場合があります。
|
注意:
|
重複行と代替主キー列
表の複数の行で、LOB列、LONG列およびLONG RAW列を除くすべての列値が同じ場合、その表には重複行が含まれています。 SET_KEY_COLUMNSプロシージャを使用すると、接続先データベースの表に、代替主キー列を指定できます。 接続先データベースの重複行を持つ表に対して代替主キー列が指定され、適用プロセス・パラメータallow_duplicate_rowsがYに設定されている場合、ソース・データベースと接続先データベースで表データを同期させるには、次の要件を満たしている必要があります。
ソース・データベースの更新によって、接続先データベースの代替キー列として指定されている1つ以上の列が必ず更新されること。
代替キー列によって、接続データベースの表内の各行が一意に識別されること。
この項の後半では、これらの要件の詳細を説明します。
主キー、少なくとも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_rowsがYに設定されている場合、ソース・データベースの重複行に対して行った更新の内容が、接続先データベースで行LCRが適用される際の変更の内容と異なることがあります。 特に、代替主キー列として指定されている列の1つが更新によって変更されない場合、接続先データベースでは、同じ重複行が複数回更新され、他の重複行が更新されないことがあります。
また、接続先データベースの表内の各行が代替キー列によって一意に識別されない場合は、複数行で識別される行LCRで、それらの行のいずれかを更新できます。 この場合、行LCR内の更新内容が、接続先データベースの表の正しい行に適用されない可能性があります。
適用プロセスでは、表内の行が重複しているかどうかを判断する場合、代替主キー列は無視されます。 適用プロセスでは、行内のLOB列、LONG列およびLONG RAW列を除くすべての列値が同じ場合にのみ、行が重複していると判断されます。 したがって、1回の更新または削除によって、表内の重複していない複数の行が変更されると、常にエラーが発生します。
たとえば、列c1、c2およびc3を持つ表で、列c1を代替主キーとして指定するためにSET_KEY_COLUMNSプロシージャが使用されているとします。 2つの行のc1列のキー値が同じで、c2列またはc3列の値が異なっている場合、適用プロセスでは、これらの行は重複行として処理されません。 行のc1値が同じであるため、更新または削除によって複数の行が変更される場合は、allow_duplicate_rows適用プロセス・パラメータの設定に関係なく、エラーが発生します。
このプロシージャでは、指定したソース・データベース内の指定のスキーマに対して、およびオプションで、ソース・データベースのスキーマが所有する表に対して、指定したインスタンス化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);
パラメータ
表15-20 SET_SCHEMA_INSTANTIATION_SCNプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
ソース・スキーマの名前。 たとえば、 |
|
|
ソース・データベースのグローバル名。 たとえば、 ドメイン名を指定しない場合は、自動的にドメイン名がデータベース名に追加されます。 たとえば、ドメイン名が |
|
|
インスタンス化SCN。 |
|
|
Oracle以外のデータベースへのデータベース・リンクの名前。 このパラメータは、ローカル適用プロセスの接続先データベースがOracle以外のデータベースの場合にのみ設定する必要があります。 |
|
|
注意: |
使用上の注意
ソース・データベースからのスキーマ内のデータベース・オブジェクトに対するDDL LCRのコミットSCNが、接続先データベースでそのデータベース・オブジェクトに対するインスタンス化SCN以下の場合は、接続先データベースでの適用プロセスで、そのDDL LCRは無視されます。 それ以外の場合は、DDL LCRが適用されます。
このプロシージャによって指定されるスキーマ・インスタンス化SCNは、次のタイプのDDL LCRで使用されます。
command_typeがCREATE TABLEのDDL LCR
NULL以外のobject_ownerが指定されていて、base_table_ownerとbase_table_nameがいずれも指定されていないDDL LCR
たとえば、このプロシージャによって設定されるスキーマ・インスタンス化SCNは、command_typeがCREATE TABLEおよびALTER USERのDDL LCRに使用されます。
このプロシージャによって指定されるスキーマ・インスタンス化SCNは、command_typeがCREATE USERのDDL LCRには使用されません。 そうしたDDL LCRには、グローバル・インスタンス化SCNが必要です。
recursiveパラメータをTRUEに設定すると、このプロシージャは、スキーマが所有しているソース・データベースの各表に表インスタンス化SCNを設定します。 このプロシージャでは、SET_TABLE_INSTANTIATION_SCNプロシージャを使用して各表のインスタンス化SCNを設定します。 表のDDL LCRおよび行LCRには、各表のインスタンス化SCNが使用されます。
recursiveパラメータをFALSEに設定すると、表にインスタンス化SCNは設定されません。
|
注意: このプロシージャによって指定されるインスタンス化SCNは、取得プロセスによって取得されたLCRに対してのみ使用されます。 ユーザーが作成したLCRには使用されません。 |
このプロシージャでは、指定したソース・データベース内の指定表に対する指定インスタンス化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);
パラメータ
表15-21 SET_TABLE_INSTANTIATION_SCNプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
ソース・オブジェクトの名前。 |
|
|
ソース・データベースのグローバル名。 たとえば、 ドメイン名を指定しない場合は、自動的にドメイン名がデータベース名に追加されます。 たとえば、ドメイン名が |
|
|
インスタンス化SCN。 |
|
|
Oracle以外のデータベースへのデータベース・リンクの名前。 このパラメータは、ローカル適用プロセスの接続先データベースがOracle以外のデータベースの場合にのみ設定する必要があります。 |
使用上の注意
ソース・データベースからの表に対するLCRのコミットSCNが、一部の接続先データベースでその表に対するインスタンス化SCN以下の場合は、接続先データベースでの適用プロセスで、そのLCRは無視されます。 それ以外の場合は、LCRが適用されます。
このプロシージャによって指定される表のインスタンス化SCNは、次のタイプのLCRで使用されます。
表に対する行LCR。
NULL以外のbase_table_ownerとbase_table_nameが指定されているDDL LCR。ただし、command_typeがCREATE TABLEのDDL LCRは除きます。
たとえば、このプロシージャによって設定されるインスタンス化SCNは、command_typeがALTER TABLEまたはCREATE TRIGGERのDDL LCRに対して使用されます。
|
注意: このプロシージャによって指定されるインスタンス化SCNは、取得プロセスによって取得されたLCRに対してのみ使用されます。 ユーザーが作成したLCRには使用されません。 |
|
関連項目:
|
このプロシージャは、指定オブジェクト用に事前作成された更新競合ハンドラを追加、変更または削除します。
構文
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);
パラメータ
表15-22 SET_UPDATE_CONFLICT_HANDLERプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
更新競合ハンドラが追加、変更または削除されるスキーマと表の名前。 たとえば、ユーザー |
|
|
作成する更新競合ハンドラのタイプ。 事前作成されたハンドラの1つを指定できます。このハンドラは、行に対してソース・データベースの列リストを適用するかどうか、または接続先データベースの行の値を保持するかどうかを決定します。
|
|
|
更新競合ハンドラを一意に識別するために使用される列の名前。 このパラメータに |
|
|
競合ハンドラがコールされる列のリスト。 適用プロセスが行論理変更レコード(行LCR)を適用しようとしたときに、リスト内の1つ以上の列に対して競合が発生すると、競合を解消するために競合ハンドラがコールされます。 競合ハンドラは、リストにない列でのみ競合が発生した場合はコールされません。 注意: 事前作成された更新競合ハンドラでは、LOB列、 |
|
|
Oracle以外のデータベースへのデータベース・リンクの名前。 このパラメータは、接続先データベースがOracle以外のデータベースの場合にのみ設定する必要があります。 注意: 現在、Oracle以外のデータベースに変更を適用するときに、競合ハンドラはサポートされません。 |
使用上の注意
既存の更新競合ハンドラを変更する場合は、既存の更新競合ハンドラの表と解消列を指定します。 事前作成メソッドまたは列リストを変更できます。
既存の更新競合ハンドラを削除する場合は、事前作成メソッドにNULLを指定し、既存の更新競合ハンドラの表、列リストおよび解消列を指定します。
更新の競合が発生した場合、次の一連の処理が実行されます。
適切な更新競合ハンドラをコールして、競合を解消します。
更新競合ハンドラが指定されていない場合、または更新競合ハンドラで競合を解消できない場合は、適用プロセス、表および操作に対する適切なエラー・ハンドラをコールしてエラーを処理します。
エラー・ハンドラが指定されていない、またはエラー・ハンドラでエラーを解決できない場合は、エラーが発生し、エラーの原因となった行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列など、列リストにない列でのみ競合が発生した場合、この競合ハンドラはコールされません。
値の依存性を設定または削除します。 値の依存性とは、複数の表の列間の関係を規定する仮想的な依存性の定義です。
適用プロセスでは、値の依存性の名前を使用して、値の依存性に定義されている列が含まれている行論理変更レコード(行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);
パラメータ
表15-23 SET_VALUE_DEPENDENCYプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
値の依存性の名前。 指定した名前の依存性が存在しない場合は、作成されます。 指定した名前の依存性が存在する場合は、指定したオブジェクトおよび属性がその依存性に追加されます。
|
|
|
表の名前。
|
|
|
表内の列名のカンマ区切りリスト。 エントリ間に空白を挿入しないでください。 |
|
|
表内の列名が含まれている |
このプロシージャでは、適用プロセスにメッセージの適用開始を指示します。
構文
DBMS_APPLY_ADM.START_APPLY( apply_name IN VARCHAR2);
パラメータ
使用上の注意
適用プロセスのステータスは永続的に記録されます。 したがって、ステータスがENABLEDの場合、適用プロセスはデータベース・インスタンスの起動時に開始されます。 適用プロセス(annn)は、Oracleバックグラウンド・プロセスです。 DBMS_AQADM.START_QUEUEおよびDBMS_AQADM.STOP_QUEUEのエンキューとデキューの状態は、適用プロセスの開始ステータスには影響を与えません。
このプロシージャでは、適用プロセスによるメッセージの適用を停止し、適用が終了していないトランザクションをロールバックします。
構文
DBMS_APPLY_ADM.STOP_APPLY( apply_name IN VARCHAR2, force IN BOOLEAN DEFAULT FALSE);
パラメータ
表15-25 STOP_APPLYプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
適用プロセス名。 |
|
|
適用プロセスの動作は、 |
使用上の注意
適用プロセスのステータスは永続的に記録されます。 したがって、ステータスが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はロールバックされます。