Oracle Streams適用プロセスは、論理変更レコード(LCR)およびユーザー・メッセージを特定のキューからデキューして、各メッセージを直接適用するか、適用ハンドラと呼ばれるユーザー定義プロシージャにパラメータとして渡します。
次の各項では、暗黙的適用の構成について説明します。
この章で説明する各タスクは、特に明記されていないかぎり、適切な権限を付与されているOracle Streams管理者が完了する必要があります。
適用プロセスを作成するには、次のいずれかのプロシージャを実行します。
DBMS_STREAMS_ADM.ADD_TABLE_RULES
DBMS_STREAMS_ADM.ADD_SUBSET_RULES
DBMS_STREAMS_ADM.ADD_SCHEMA_RULES
DBMS_STREAMS_ADM.ADD_GLOBAL_RULES
DBMS_STREAMS_ADM.ADD_MESSAGE_RULE
DBMS_APPLY_ADM.CREATE_APPLY
DBMS_STREAMS_ADMパッケージ内の各プロシージャでは、指定された名前を持つ適用プロセスが存在しない場合は適用プロセスが作成され、適用プロセスにポジティブ・ルール・セットとネガティブ・ルール・セットのいずれも存在しない場合はそのいずれかのルール・セットが作成されます。また、ルール・セットに表ルール、スキーマ・ルール、グローバル・ルールまたはメッセージ・ルールを追加することもできます。
DBMS_APPLY_ADMパッケージのCREATE_APPLYプロシージャでは、適用プロセスは作成されますが、適用プロセスのルール・セットまたはルールは作成されません。ただし、CREATE_APPLYプロシージャを使用すると、ポジティブ・ルール・セットまたはネガティブ・ルール・セットのいずれかとして適用プロセスに関連付ける既存のルール・セット、その他の多くのオプション(適用ハンドラ、適用ユーザー、適用タグなど)およびメッセージをバッファ・キューからデキューするか、永続キューからデキューするかを指定できます。
単一の適用プロセスでは、バッファ・キューまたは永続キューのいずれかからメッセージをデキューする必要があります。したがって、単一の適用プロセスで取得LCRを適用する場合、永続LCRまたは永続ユーザー・メッセージは適用できません。ただし、単一の適用プロセスでは、永続LCRおよび永続ユーザー・メッセージの両方を適用できます。
この章の例では、取得LCR、永続LCRおよび永続ユーザー・メッセージを適用する適用プロセスを作成しています。適用プロセスを作成する前に、適用プロセスに関連付けるANYDATAキューを作成します(存在しない場合)。
|
注意:
|
|
関連項目:
|
この項では、DBMS_STREAMS_ADMパッケージを使用して適用プロセスを作成する例を示します。
次の例では、DBMS_STREAMS_ADMパッケージ内のADD_SCHEMA_RULESプロシージャを実行して、取得LCRを適用する適用プロセスを作成します。
BEGIN
DBMS_STREAMS_ADM.ADD_SCHEMA_RULES(
schema_name => 'hr',
streams_type => 'apply',
streams_name => 'strm01_apply',
queue_name => 'streams_queue',
include_dml => TRUE,
include_ddl => FALSE,
include_tagged_lcr => FALSE,
source_database => 'dbs1.example.com',
inclusion_rule => TRUE);
END;
/
このプロシージャを実行すると、次のアクションが実行されます。
ローカル・データベースに取得LCRを適用する適用プロセスstrm01_applyが作成されます。適用プロセスは、存在していない場合にのみ作成されます。
適用プロセスが、streams_queueという名前の既存のキューに関連付けられます。
適用プロセスにポジティブ・ルール・セットがない場合は、ポジティブ・ルール・セットが作成され、適用プロセスに関連付けられます。これは、inclusion_ruleパラメータがTRUEに設定されているためです。ルール・セットではSYS.STREAMS$_EVALUATION_CONTEXT評価コンテキストが使用されます。ルール・セットの名前はシステムによって生成されます。
hrスキーマのデータベース・オブジェクトに対するDML変更の結果を含む行LCRに対してTRUEと評価される1つのルールが作成されます。
inclusion_ruleパラメータがTRUEに設定されているため、適用プロセスに関連付けられているポジティブ・ルール・セットにルールが追加されます。
適用プロセスのapply_tagが、'00'(ゼロ2つ)と同等の16進数の値に設定されます。適用プロセスによって生成されたREDOエントリには、この値のタグが含まれます。
行LCRにNULLタグが含まれている場合にのみ適用プロセスによって行LCRが適用されるように指定されます。これは、include_tagged_lcrパラメータがFALSEに設定されているためです。この動作は、適用プロセスのシステム生成ルールによって実現されています。
dbs1.example.comソース・データベースからのLCRが適用プロセスによって適用されるように指定されます。適用プロセスのルール・セットのルールによって、適用プロセスでデキューされるメッセージが決定されます。適用プロセスによってdbs1.example.com以外のソース・データベースからのLCRがデキューされると、エラーが発生します。
次の例では、DBMS_STREAMS_ADMパッケージ内のADD_MESSAGE_RULEプロシージャを実行して、永続キューのユーザー・メッセージをデキューおよび処理する適用プロセスを作成します。
BEGIN
DBMS_STREAMS_ADM.ADD_MESSAGE_RULE(
message_type => 'oe.order_typ',
rule_condition => ':msg.order_status = 1',
streams_type => 'apply',
streams_name => 'strm02_apply',
queue_name => 'strm02_queue',
inclusion_rule => TRUE);
END;
/
このプロシージャを実行すると、次のアクションが実行されます。
oe.order_typタイプのユーザー・メッセージをデキューし、適用プロセスのメッセージ・ハンドラに送信する適用プロセスstrm02_applyが作成されます。適用プロセスは、存在していない場合にのみ作成されます。
適用プロセスが、strm02_queueという名前の既存のキューに関連付けられます。
適用プロセスにポジティブ・ルール・セットがない場合は、ポジティブ・ルール・セットが作成され、適用プロセスに関連付けられます。これは、inclusion_ruleパラメータがTRUEに設定されているためです。ルール・セットの名前はシステムによって生成されます。このルール・セットでは評価コンテキストは使用されません。
ルール条件を満たすユーザー・メッセージに対してTRUEと評価される1つのルールが作成されます。このルールでは、システムによって作成された評価コンテキストがメッセージ・タイプに使用されます。ルール名および評価コンテキスト名は、システムによって生成されます。
inclusion_ruleパラメータがTRUEに設定されているため、適用プロセスに関連付けられているポジティブ・ルール・セットにルールが追加されます。
適用プロセスのapply_tagが、'00'(ゼロ2つ)と同等の16進数の値に設定されます。適用プロセスによって生成されたREDOエントリ(メッセージ・ハンドラによって生成されたREDOエントリを含む)には、この値のタグが含まれます。
|
注意: DBMS_APPLY_ADMパッケージのALTER_APPLYプロシージャを使用すると、適用プロセスのメッセージ・ハンドラを指定できます。 |
この項では、DBMS_APPLY_ADMパッケージを使用して適用プロセスを作成する例を示します。
|
関連項目:
|
次の例では、DBMS_APPLY_ADMパッケージ内のCREATE_APPLYプロシージャを実行して、取得LCRを適用する適用プロセスを作成します。
BEGIN
DBMS_APPLY_ADM.CREATE_APPLY(
queue_name => 'strm03_queue',
apply_name => 'strm03_apply',
rule_set_name => 'strmadmin.strm03_rule_set',
message_handler => NULL,
ddl_handler => 'strmadmin.history_ddl',
apply_user => 'hr',
apply_database_link => NULL,
apply_tag => HEXTORAW('5'),
apply_captured => TRUE,
precommit_handler => NULL,
negative_rule_set_name => NULL,
source_database => 'dbs1.example.com');
END;
/
このプロシージャを実行すると、次のアクションが実行されます。
strm03_applyという名前の適用プロセスが作成されます。この場合、同じ名前の適用プロセスが存在していない必要があります。
適用プロセスが、strm03_queueという名前の既存のキューに関連付けられます。
適用プロセスが、strm03_rule_setという名前の既存のルール・セットに関連付けられます。このルール・セットは、適用プロセスのポジティブ・ルール・セットとなります。
適用プロセスでメッセージ・ハンドラが使用されないように指定されます。
DDLハンドラがstrmadminスキーマのhistory_ddl PL/SQLプロシージャになるように指定されます。CREATE_APPLYプロシージャを実行するユーザーには、history_ddl PL/SQLプロシージャのEXECUTE権限が付与されている必要があります。このプロシージャを作成する例については、Oracle Streamsレプリケーション管理者ガイドを参照してください。
変更を適用するユーザーが、CREATE_APPLYプロシージャを実行するユーザー(Oracle Streams管理者)ではなく、hrになるように指定されます。
apply_database_linkパラメータがNULLに設定されているため、変更が適用プロセスによってローカル・データベースに適用されるように指定されます。
適用プロセスによって生成される各REDOエントリに、'5'と同等の16進数のタグが含まれるように指定されます。
適用プロセスによって、永続LCRまたは永続ユーザー・メッセージではなく、取得LCRが適用されるように指定されます。したがって、取得プロセスではなくユーザー・アプリケーションによって作成されたLCRが適用プロセスのキューにステージングされると、この適用プロセスではLCRは適用されません。
適用プロセスでプリコミット・ハンドラが使用されないように指定されます。
適用プロセスでネガティブ・ルール・セットが使用されないように指定されます。
dbs1.example.comソース・データベースからのLCRが適用プロセスによって適用されるように指定されます。適用プロセスのルール・セットのルールによって、適用プロセスでデキューされるメッセージが決定されます。適用プロセスによってdbs1.example.com以外のソース・データベースからのLCRがデキューされると、エラーが発生します。
次の例では、DBMS_APPLY_ADMパッケージ内のCREATE_APPLYプロシージャを実行して、永続LCRを適用する適用プロセスを作成します。
BEGIN
DBMS_APPLY_ADM.CREATE_APPLY(
queue_name => 'strm04_queue',
apply_name => 'strm04_apply',
rule_set_name => 'strmadmin.strm04_rule_set',
message_handler => NULL,
ddl_handler => NULL,
apply_user => NULL,
apply_database_link => NULL,
apply_tag => NULL,
apply_captured => FALSE,
precommit_handler => NULL,
negative_rule_set_name => NULL);
END;
/
このプロシージャを実行すると、次のアクションが実行されます。
strm04_applyという名前の適用プロセスが作成されます。この場合、同じ名前の適用プロセスが存在していない必要があります。
適用プロセスが、strm04_queueという名前の既存のキューに関連付けられます。
適用プロセスが、strm04_rule_setという名前の既存の ルール・セット に関連付けられます。このルール・セットは、適用プロセスの ポジティブ・ルール・セットとなります。
適用プロセスでメッセージ・ハンドラが使用されないように指定されます。
適用プロセスでDDLハンドラが使用されないように指定されます。
apply_userパラメータがNULLのため、変更を適用するユーザーがCREATE_APPLYプロシージャを実行するユーザーになるように指定されます。
apply_database_linkパラメータがNULLに設定されているため、変更が適用プロセスによってローカル・データベースに適用されるように指定されます。
適用プロセスによって生成される各REDOエントリに、NULLタグが含まれるように指定されます。
適用プロセスによって取得LCRが適用されないように指定されます。したがって、適用プロセスで、永続LCRまたは適用プロセス・キューの永続キュー部分にある永続ユーザー・メッセージを適用できます。
適用プロセスでプリコミット・ハンドラが使用されないように指定されます。
適用プロセスでネガティブ・ルール・セットが使用されないように指定されます。
適用プロセスを作成した後、ADD_TABLE_RULESまたはADD_SUBSET_RULESプロシージャを実行し、適用プロセスのルール・セットにルールを追加します。これらのルールによって、適用プロセスで特定の表のLCRが適用されるように指定されます。
次の例では、DBMS_APPLY_ADMパッケージ内のCREATE_APPLYプロシージャを実行して、永続ユーザー・メッセージを適用する適用プロセスを作成します。
BEGIN
DBMS_APPLY_ADM.CREATE_APPLY(
queue_name => 'strm05_queue',
apply_name => 'strm05_apply',
rule_set_name => 'strmadmin.strm05_rule_set',
message_handler => 'strmadmin.mes_handler',
ddl_handler => NULL,
apply_user => NULL,
apply_database_link => NULL,
apply_tag => NULL,
apply_captured => FALSE,
precommit_handler => NULL,
negative_rule_set_name => NULL);
END;
/
このプロシージャを実行すると、次のアクションが実行されます。
strm05_applyという名前の適用プロセスが作成されます。この場合、同じ名前の適用プロセスが存在していない必要があります。
適用プロセスが、strm05_queueという名前の既存のキューに関連付けられます。
適用プロセスが、strm05_rule_setという名前の既存の ルール・セット に関連付けられます。このルール・セットは、適用プロセスの ポジティブ・ルール・セットとなります。
メッセージ・ハンドラがstrmadminスキーマのmes_handler PL/SQLプロシージャになるように指定します。CREATE_APPLYプロシージャを実行するユーザーには、mes_handler PL/SQLプロシージャのEXECUTE権限が付与されている必要があります。
適用プロセスでDDLハンドラが使用されないように指定されます。
apply_userパラメータがNULLのため、変更を適用するユーザーがCREATE_APPLYプロシージャを実行するユーザーになるように指定されます。
apply_database_linkパラメータがNULLに設定されているため、変更が適用プロセスによってローカル・データベースに適用されるように指定されます。
適用プロセスによって生成される各REDOエントリに、NULLタグが含まれるように指定されます。
適用プロセスによって取得LCRが適用されないように指定されます。したがって、適用プロセスで、永続LCRまたは適用プロセス・キューの永続キュー部分にある永続ユーザー・メッセージを適用できます。
適用プロセスでプリコミット・ハンドラが使用されないように指定されます。
適用プロセスでネガティブ・ルール・セットが使用されないように指定されます。