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または適用プロセス・キューの永続キュー部分にある永続ユーザー・メッセージを適用できます。
適用プロセスでプリコミット・ハンドラが使用されないように指定されます。
適用プロセスでネガティブ・ルール・セットが使用されないように指定されます。