次の各項では、ANYDATAキューと伝播の管理について説明します。
この章で説明する各タスクは、特に明記されていないかぎり、適切な権限を付与されているOracle Streams管理者が完了する必要があります。
ANYDATAキューでは、ペイロードがANYDATA型であるメッセージがステージングされます。したがって、ANYDATAキューでは、ペイロードがANYDATAラッパーにラップされていれば、ほぼすべての型のペイロードのメッセージをステージングできます。Oracle Streamsの各取得プロセス、適用プロセスおよびメッセージ・クライアントは1つのANYDATAキューに関連付けられ、Oracle Streamsの各伝播は1つのANYDATAソース・キューと1つのANYDATA宛先キューに関連付けられます。
この項では、キューに関連する次のタスクの実行手順を説明します。
ユーザーが保護キューでエンキューやデキューなどのキュー操作を実行できるようにするには、そのユーザーをキューの保護キュー・ユーザーとして構成する必要があります。DBMS_STREAMS_ADMパッケージのSET_UP_QUEUEプロシージャを使用して保護キューを作成すると、キュー所有者とqueue_userパラメータで指定したユーザーは自動的にキューの保護ユーザーとして構成されます。他のユーザーに対してキュー操作の実行を許可する場合は、そのユーザーを次のいずれかの方法で構成できます。
SET_UP_QUEUEを実行してqueue_userを指定します。キューが存在する場合、キューの作成はスキップされますが、新規キュー・ユーザーを指定した場合はそのユーザーが構成されます。
ユーザーをOracle Streamsアドバンスト・キューイング(AQ)・エージェントに手動で関連付けます。
次の例に、ユーザーをOracle Streams AQエージェントに手動で関連付ける手順を示します。「ANYDATAキューの作成」で作成したstreams_queueに対して、oeユーザーがキュー操作を実行できるようにするとします。次の手順に従って、oeユーザーをstreams_queueの保護キュー・ユーザーとして構成します。
SQL*Plusで、Oracle Streams AQエージェントを作成してユーザーを変更できる管理ユーザーとして接続します。
SQL*Plusでデータベースに接続する方法については、Oracle Database管理者ガイドを参照してください。
次のように入力してエージェントを作成します。
EXEC DBMS_AQADM.CREATE_AQ_AGENT(agent_name => 'streams_queue_agent');
ユーザーがキューからメッセージをデキューできるようにする必要がある場合は、エージェントを保護キューのサブスクライバにします。
DECLARE
subscriber SYS.AQ$_AGENT;
BEGIN
subscriber := SYS.AQ$_AGENT('streams_queue_agent', NULL, NULL);
DBMS_AQADM.ADD_SUBSCRIBER(
queue_name => 'strmadmin.streams_queue',
subscriber => subscriber,
rule => NULL,
transformation => NULL);
END;
/
ユーザーをエージェントに関連付けます。
BEGIN
DBMS_AQADM.ENABLE_DB_ACCESS(
agent_name => 'streams_queue_agent',
db_username => 'oe');
END;
/
ユーザーにDBMS_STREAMS_MESSAGINGパッケージまたはDBMS_AQパッケージのEXECUTE権限が付与されていない場合は、これらの権限を付与します。
GRANT EXECUTE ON DBMS_STREAMS_MESSAGING TO oe; GRANT EXECUTE ON DBMS_AQ TO oe;
前述の手順を完了すると、oeユーザーはstreams_queueの保護ユーザーとなり、このキューを操作できます。ただし、ユーザーにはエンキュー権限やデキュー権限など、キュー操作を実行するための特定の権限を付与する必要もあります。
|
関連項目:
|
次のような理由でユーザーに対して、保護キューのキュー操作を禁止する場合があります。
取得プロセスまたは同期取得を削除したが、取得プロセスまたは同期取得で使用されていたキューを削除しておらず、取得ユーザーであったユーザーに対して残りの保護キューの操作を禁止する場合。
適用プロセスを削除したが、適用プロセスで使用されていたキューを削除しておらず、適用ユーザーであったユーザーには残りの保護キューの操作を禁止する場合。
DBMS_APPLY_ADMパッケージのALTER_APPLYプロシージャを使用して適用プロセスのapply_userを変更しており、変更前のapply_userには適用プロセスのキューの操作を禁止する場合。
「保護キューでのユーザー操作の有効化」で説明した手順に従って、ユーザーに保護キューの操作を許可したが、この後、このユーザーには保護キューのキュー操作を禁止する場合。
保護キュー・ユーザーを無効化するには、キューに対するENQUEUEおよびDEQUEUE権限をユーザーから取り消す方法と、DBMS_AQADMパッケージのDISABLE_DB_ACCESSプロシージャを実行する方法があります。たとえば、oeユーザーに対して、「ANYDATAキューの作成」で作成したstreams_queueのキュー操作を禁止するとします。
|
注意: 複数の保護キューにOracle Streams AQエージェントを使用している場合は、そのエージェントに対してDISABLE_DB_ACCESSを実行すると、そのエージェントに関連付けられているユーザーがこれらすべてのキューに対する操作を実行できなくなります。 |
次のプロシージャを実行し、oeユーザーに対して保護キューstreams_queueのキュー操作を禁止します。
BEGIN
DBMS_AQADM.DISABLE_DB_ACCESS(
agent_name => 'streams_queue_agent',
db_username => 'oe');
END;
/
不要になったエージェントは削除できます。
BEGIN
DBMS_AQADM.DROP_AQ_AGENT(
agent_name => 'streams_queue_agent');
END;
/
キューに対する権限がユーザーにとって不要になった場合は、その権限を取り消します。
BEGIN DBMS_AQADM.REVOKE_QUEUE_PRIVILEGE ( privilege => 'ALL', queue_name => 'strmadmin.streams_queue', grantee => 'oe'); END; /
|
関連項目:
|
既存のANYDATAキューを削除するには、DBMS_STREAMS_ADMパッケージのREMOVE_QUEUEプロシージャを使用します。REMOVE_QUEUEプロシージャを実行すると、キューにある既存のメッセージがコンシュームされるまでプロシージャは待機します。その後、プロシージャによってキューが停止され、キューに対するエンキューまたはデキューが禁止されます。停止したキューは、プロシージャによって削除されます。
キューのキュー表が空で他のキューに使用されていない場合、キュー表も削除できます。キュー表を削除するには、drop_unused_queue_tableパラメータにTRUE(デフォルト)を指定します。
また、cascadeパラメータをTRUEに設定すると、そのキューを使用するすべてのOracle Streamsクライアントを削除できます。デフォルトでは、cascadeパラメータはFALSEに設定されています。
たとえば、strmadminスキーマ内のANYDATAキューstreams_queueを削除して、そのキューの空のキュー表を削除するには、次のプロシージャを実行します。
BEGIN
DBMS_STREAMS_ADM.REMOVE_QUEUE(
queue_name => 'strmadmin.streams_queue',
cascade => FALSE,
drop_unused_queue_table => TRUE);
END;
/
この例ではcascadeパラメータがFALSEに設定されているため、Oracle Streamsクライアントがstreams_queueを使用していない場合のみ、このプロシージャはそのキューを削除します。cascadeパラメータがFALSEに設定されており、Oracle Streamsクライアントがそのキューを使用している場合は、エラーが発生します。
伝播では、Oracle Streamsのソース・キューから宛先キューにメッセージが伝播されます。この項では、次のタスクの実行手順を説明します。
また、Oracle Streamsの伝播は、Oracle Streamsアドバンスト・キューイング(AQ)の機能を使用して管理することもできます。
|
関連項目:
|
既存の伝播を開始するには、DBMS_PROPAGATION_ADMパッケージのSTART_PROPAGATIONプロシージャを実行します。たとえば、次のプロシージャでは、伝播strm01_propagationが開始されます。
BEGIN
DBMS_PROPAGATION_ADM.START_PROPAGATION(
propagation_name => 'strm01_propagation');
END;
/
既存の伝播を停止するには、DBMS_PROPAGATION_ADMパッケージのSTOP_PROPAGATIONプロシージャを実行します。たとえば、次のプロシージャでは、伝播strm01_propagationが停止されます。
BEGIN
DBMS_PROPAGATION_ADM.STOP_PROPAGATION(
propagation_name => 'strm01_propagation',
force => FALSE);
END;
/
伝播の停止時に統計を消去するには、forceパラメータをTRUEに設定します。伝播に問題が発生した場合は、forceパラメータをTRUEに設定して伝播を停止してから伝播を再開始すると、問題を解決できることがあります。forceパラメータがFALSEに設定されている場合は、伝播の統計は消去されません。
既存の伝播ジョブのスケジュールを変更するには、DBMS_AQADMパッケージのALTER_PROPAGATION_SCHEDULEプロシージャを使用します。次の各項では、キュー・ツー・キュー伝播およびキュー・ツーdblink伝播の伝播ジョブのスケジュールを変更する例を説明します。これらの例では、メッセージを15分(900秒)ごとに300秒間伝播させ、25秒待機してから、完全に伝播されたキューの新しいメッセージが伝播されるように、伝播ジョブを設定します。
この項の内容は次のとおりです。
|
関連項目:
|
dbs2.example.comデータベース・リンクを使用してstrmadmin.strm_a_queueソース・キューからstrmadmin.strm_b_queue宛先キューにメッセージを伝播するキュー・ツー・キュー伝播の伝播ジョブのスケジュールを変更するには、次のプロシージャを実行します。
BEGIN DBMS_AQADM.ALTER_PROPAGATION_SCHEDULE( queue_name => 'strmadmin.strm_a_queue', destination => 'dbs2.example.com', duration => 300, next_time => 'SYSDATE + 900/86400', latency => 25, destination_queue => 'strmadmin.strm_b_queue'); END; /
各キュー・ツー・キュー伝播には独自の伝播ジョブがあるため、このプロシージャでは、指定した2つのキュー間でメッセージが伝播される伝播のスケジュールのみを変更できます。キュー・ツー・キュー伝播の伝播スケジュールを変更するには、destination_queueパラメータで宛先キューの名前を指定する必要があります。
dbs3.example.comデータベース・リンクを使用してstrmadmin.streams_queueソース・キューからメッセージを伝播するキュー・ツーdblink伝播の伝播ジョブのスケジュールを変更するには、次のプロシージャを実行します。
BEGIN DBMS_AQADM.ALTER_PROPAGATION_SCHEDULE( queue_name => 'strmadmin.streams_queue', destination => 'dbs3.example.com', duration => 300, next_time => 'SYSDATE + 900/86400', latency => 25); END; /
伝播がキュー・ツーdblink伝播であるため、destination_queueパラメータは指定されていません。このタスクは、dbs3.example.com データベース・リンクを使用するすべての宛先キューに対してソース・キューからメッセージを伝播するすべてのキュー・ツーdblink伝播に影響します。
伝播には、1つのポジティブ・ルール・セットおよび1つのネガティブ・ルール・セットを指定できます。伝播では、ポジティブ・ルール・セット内の1つ以上のルールがTRUEと評価される場合にメッセージは伝播され、ネガティブ・ルール・セット内の1つ以上のルールがTRUEと評価される場合は変更が破棄されます。ネガティブ・ルール・セットはポジティブ・ルール・セットの前に評価されます。
この項の内容は次のとおりです。
既存のルール・セットを既存の伝播のポジティブ・ルール・セットとして指定するには、ALTER_PROPAGATIONプロシージャのrule_set_nameパラメータを使用します。このプロシージャはDBMS_PROPAGATION_ADMパッケージに含まれています。
たとえば、次のプロシージャでは伝播strm01_propagationのポジティブ・ルール・セットがstrm02_rule_setに設定されます。
BEGIN
DBMS_PROPAGATION_ADM.ALTER_PROPAGATION(
propagation_name => 'strm01_propagation',
rule_set_name => 'strmadmin.strm02_rule_set');
END;
/
既存のルール・セットを既存の伝播のネガティブ・ルール・セットとして指定するには、ALTER_PROPAGATIONプロシージャのnegative_rule_set_nameパラメータを使用します。このプロシージャはDBMS_PROPAGATION_ADMパッケージに含まれています。
たとえば、次のプロシージャでは伝播strm01_propagationのネガティブ・ルール・セットがstrm03_rule_setに設定されます。
BEGIN
DBMS_PROPAGATION_ADM.ALTER_PROPAGATION(
propagation_name => 'strm01_propagation',
negative_rule_set_name => 'strmadmin.strm03_rule_set');
END;
/
伝播のルール・セットにルールを追加するには、次のいずれかのプロシージャを実行します。
DBMS_STREAMS_ADM.ADD_TABLE_PROPAGATION_RULES
DBMS_STREAMS_ADM.ADD_SUBSET_PROPAGATION_RULES
DBMS_STREAMS_ADM.ADD_SCHEMA_PROPAGATION_RULES
DBMS_STREAMS_ADM.ADD_GLOBAL_PROPAGATION_RULES
ADD_SUBSET_PROPAGATION_RULESプロシージャ以外のこれらのプロシージャでは、伝播のポジティブ・ルール・セットまたはネガティブ・ルール・セットにルールを追加できます。ADD_SUBSET_PROPAGATION_RULESプロシージャでは、伝播のポジティブ・ルール・セットのみにルールを追加できます。
この項の内容は次のとおりです。
次の例では、DBMS_STREAMS_ADMパッケージのADD_TABLE_PROPAGATION_RULESプロシージャを実行して、既存の伝播strm01_propagationのポジティブ・ルール・セットにルールを追加します。
BEGIN
DBMS_STREAMS_ADM.ADD_TABLE_PROPAGATION_RULES(
table_name => 'hr.locations',
streams_name => 'strm01_propagation',
source_queue_name => 'strmadmin.strm_a_queue',
destination_queue_name => 'strmadmin.strm_b_queue@dbs2.example.com',
include_dml => TRUE,
include_ddl => TRUE,
source_database => 'dbs1.example.com',
inclusion_rule => TRUE);
END;
/
このプロシージャを実行すると、次のアクションが実行されます。
2つのルールが作成されます。一方のルールは、hr.locations表に対するDML変更の結果を含む行LCRについてTRUEと評価されます。他方のルールは、hr.locations表に対するDDL変更を含むDDL LCRについてTRUEと評価されます。ルール名は、システムによって生成されます。
どちらのルールも、dbs1.example.comソース・データベースで変更が発生したLCRに対してのみTRUEと評価されるように指定されます。
inclusion_ruleパラメータがTRUEに設定されているため、これらの2つのルールは、伝播に関連付けられたポジティブ・ルール・セットに追加されます。
次の例では、DBMS_STREAMS_ADMパッケージのADD_TABLE_PROPAGATION_RULESプロシージャを実行して、既存の伝播strm01_propagationのネガティブ・ルール・セットにルールを追加します。
BEGIN
DBMS_STREAMS_ADM.ADD_TABLE_PROPAGATION_RULES(
table_name => 'hr.departments',
streams_name => 'strm01_propagation',
source_queue_name => 'strmadmin.strm_a_queue',
destination_queue_name => 'strmadmin.strm_b_queue@dbs2.example.com',
include_dml => TRUE,
include_ddl => TRUE,
source_database => 'dbs1.example.com',
inclusion_rule => FALSE);
END;
/
このプロシージャを実行すると、次のアクションが実行されます。
2つのルールが作成されます。一方のルールはhr.departments表に対するDML変更の結果を含む行LCRについてTRUEと評価され、他方のルールは、hr.departments表に対するDDL変更を含むDDL LCRについてTRUEと評価されます。ルール名は、システムによって生成されます。
どちらのルールも、dbs1.example.comソース・データベース で変更が発生したLCRに対してのみ TRUEと評価されるように指定されます。
inclusion_ruleパラメータがFALSEに設定されているため、これらの2つのルールは、伝播に関連付けられたネガティブ・ルール・セットに追加されます。
DBMS_STREAMS_ADMパッケージのREMOVE_RULEプロシージャを実行すると、既存の伝播のルール・セットからルールを削除できます。たとえば、次のプロシージャでは、伝播strm01_propagationのポジティブ・ルール・セットからルールdepartments3が削除されます。
BEGIN
DBMS_STREAMS_ADM.REMOVE_RULE(
rule_name => 'departments3',
streams_type => 'propagation',
streams_name => 'strm01_propagation',
drop_unused_rule => TRUE,
inclusion_rule => TRUE);
END;
/
この例では、REMOVE_RULEプロシージャのdrop_unused_ruleパラメータがTRUEに設定されています。これはデフォルトの設定です。したがって、削除するルールが他のどのルール・セットにも含まれていなければ、そのルールはデータベースから削除されます。drop_unused_ruleパラメータがFALSEに設定されている場合、ルールはルール・セットから削除されますが、他のどのルール・セットにも含まれていない場合でも、データベースからは削除されません。
inclusion_ruleパラメータがFALSEに設定されている場合、REMOVE_RULEプロシージャによって、伝播のポジティブ・ルール・セットからではなく、ネガティブ・ルール・セットからルールが削除されます。
伝播のルール・セットからすべてのルールを削除するには、REMOVE_RULEプロシージャの実行時にrule_nameパラメータにNULLを指定します。
伝播からルール・セットを削除するには、DBMS_PROPAGATION_ADMパッケージのALTER_PROPAGATIONプロシージャを使用します。このプロシージャでは、ポジティブ・ルール・セットまたはネガティブ・ルール・セット、あるいはその両方を削除できます。伝播のポジティブ・ルール・セットを削除するには、remove_rule_setパラメータをTRUEに設定します。伝播のネガティブ・ルール・セットを削除するには、remove_negative_rule_setパラメータをTRUEに設定します。
たとえば、次のプロシージャでは、伝播strm01_propagationからポジティブ・ルール・セットとネガティブ・ルール・セットの両方が削除されます。
BEGIN
DBMS_PROPAGATION_ADM.ALTER_PROPAGATION(
propagation_name => 'strm01_propagation',
remove_rule_set => TRUE,
remove_negative_rule_set => TRUE);
END;
/
既存の伝播を削除するには、DBMS_PROPAGATION_ADMパッケージのDROP_PROPAGATIONプロシージャを実行します。たとえば、次のプロシージャでは、伝播strm01_propagationが削除されます。
BEGIN
DBMS_PROPAGATION_ADM.DROP_PROPAGATION(
propagation_name => 'strm01_propagation',
drop_unused_rule_sets => TRUE);
END;
/
drop_unused_rule_setsパラメータがTRUEに設定されているため、このプロシージャでは伝播strm01_propagationで使用されているすべてのルール・セットも削除されます。ただし、他のOracle Streamsクライアントで使用されているルール・セットは削除されません。drop_unused_rule_setsパラメータがTRUEに設定されている場合、伝播のポジティブ・ルール・セットとネガティブ・ルール・セットが両方とも削除されます。このプロシージャによってルール・セットが削除された場合、そのルール・セット内のルールのうち、他のルール・セットに含まれていないルールも削除されます。