次の各項では、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エージェントに手動で関連付ける手順を示します。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
ユーザーに対して、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
に設定されている場合、伝播のポジティブ・ルール・セットとネガティブ・ルール・セットが両方とも削除されます。このプロシージャによってルール・セットが削除された場合、そのルール・セット内のルールのうち、他のルール・セットに含まれていないルールも削除されます。