2 Workspace Managerイベント

ある種のアプリケーションでは、Workspace Manager操作の内容を認識し、それに基づいてなんらかのアクションを実行する必要があります。数種類のWorkspace Manager操作をイベントとして取得できます。

Workspace Managerは、これらのイベントを対象アプリケーションに非同期で通信するためのフレームワークを提供します。これにより、アプリケーションはイベントに基づいてなんらかのアクションを実行できます。イベントを使用できる使用例の一部を次に示します。

  • 作業領域がLIVEにマージされるたびに、そのデータをリフレッシュできるように、アプリケーションが通知を受け取る必要がある場合。

  • 新規セーブポイントが作成されるたびに、作業領域データをアーカイブする必要がある場合。

Workspace Managerのイベント・フレームワークは、Oracle Advanced Queuing(AQ)機能に基づいて構築されています。非同期通知、永続性、伝播、アクセス制御、履歴およびルールベースのサブスクリプションなど、AQのメッセージ機能をWorkspace Managerイベントに使用できます。

Workspace Managerは、イベントのエンキューに使用するマルチ・コンシューマ・キューを作成します。イベントのタイプ、イベントをトリガーしたユーザーと作業領域、バージョニングされた表の名前など、イベント関連情報がイベント・ペイロード内で初期化され、エンキューされます。アプリケーションは、必要に応じてサブスクリプション・ルールを指定して、これらのイベントにサブスクライブできます。ルールを満たしているイベントのみがサブスクライバに適用されます。サブスクライバは、キュー内のイベントのリスニング、通知のコールバックの登録、キューからのイベントの明示的デキューなど、様々な方法でイベント通知を取得できます。

イベントは他のアプリケーションに非同期で通信されるため、イベントを生成している作業領域操作のパフォーマンスは影響を受けません。

注:

アプリケーションでWorkspace Managerイベントを使用するには、『Oracle Databaseアドバンスト・キューイング・ユーザーズ・ガイド』を参照して、関連するAQの概念と手法を理解する必要があります。

この章には次の項が含まれます。

2.1 Workspace Managerイベントのリスト

次の表に、Workspace Managerイベントと各イベントが発生する状況を示します。

表2-1 Workspace Managerイベント

イベント 発生する状況

TABLE_MERGE_W_REMOVE_DATA

remove_dataTRUEに設定してMergeTableがコールされた場合。

TABLE_MERGE_WO_REMOVE_DATA

remove_dataFALSEに設定してMergeTableがコールされた場合。

TABLE_REFRESH

RefreshTableがコールされた場合。

TABLE_ROLLBACK

RollbackTableがコールされた場合。

WORKSPACE_COMPRESS

CompressWorkspaceまたはCompressWorkspaceTreeがコールされた場合。

WORKSPACE_CREATE

CreateWorkspaceがコールされた場合。

WORKSPACE_MERGE_W_REMOVE

remove_workspaceTRUEに設定してMergeWorkspaceがコールされた場合。

WORKSPACE_MERGE_WO_REMOVE

remove_workspaceFALSEに設定してMergeWorkspaceがコールされた場合。

WORKSPACE_REFRESH

RefreshWorkspaceがコールされた場合。

WORKSPACE_REMOVE

RemoveWorkspaceまたはRemoveWorkspaceTreeがコールされた場合。

WORKSPACE_ROLLBACK

RollbackWorkspaceがコールされた場合。

WORKSPACE_VERSION

明示的セーブポイントまたは暗黙的セーブポイントが作成された結果、作業領域内で新バージョンが作成された場合。(セーブポイントについては、「セーブポイントの使用」を参照してください。)

2.2 イベント・パラメータ

イベントが発生すると、WMSYS.WM$EVENT_TYPEというオブジェクト型にバンドルされているパラメータに情報が格納され、イベント・キューにエンキューされます。サブスクライバは、通知の受信時にイベント・オブジェクトをデキューできます。

次の表で、Workspace Managerのイベント・パラメータについて説明します。

表2-2 Workspace Managerイベント・パラメータ

イベント・パラメータ データ型 説明

event_name

VARCHAR2(128)

イベントの型名。

workspace_name

VARCHAR2(128)

イベント発生の原因となった作業領域。

parent_workspace_name

VARCHAR2(128)

イベント発生の原因となった作業領域の親作業領域。

user_name

VARCHAR2(128)

イベント発生の原因となったユーザー。

table_name

VARCHAR2(128)

イベントが発生したバージョン対応表。このパラメータがイベントに該当しない場合、値はNULLです。

aux_params

WMSYS.WM$NV_PAIR_NT_TYPE (WMSYS.WM$NV_PAIR_TYPEの表)

追加のイベント情報を含むことができる名前/値ペアのネストした表。

TABLE_xxxイベントの場合は、操作に使用されたWHERE句の文字列を含む1行があります。

WORKSPACE_VERSIONイベントの場合は、新規に作成されたバージョンに関連付けられているセーブポイント名を含む1行があります。

2.3 ALLOW_CAPTURE_EVENTSシステム・パラメータ

Workspace Managerのシステム・パラメータALLOW_CAPTURE_EVENTSは、イベントを取得するために使用できます。

Workspace Managerイベントを取得する前に、SetSystemParameterプロシージャを使用して、Workspace Managerシステム・パラメータALLOW_CAPTURE_EVENTSの値をONに設定する必要があります。ただし、このように設定してもイベントが取得されない場合、イベントを取得するにはSetCaptureEventプロシージャを使用する必要があります。

その後、Workspace Managerイベントの取得を無効にするには、SetSystemParameterプロシージャを使用してALLOW_CAPTURE_EVENTSの値をOFFに設定します。ただし、その前に現在取得中のイベントがないようにする必要があります。例2-1に、すべてのイベントの取得の有効化と無効化、およびすべてのイベントの取得の開始と停止に使用する一連のプロシージャ・コールを示します。

例2-1 Workspace Managerイベントの取得

-- Allow Workspace Manager events to be captured. (Required for SetCaptureEvent)
EXECUTE DBMS_WM.SetSystemParameter ('ALLOW_CAPTURE_EVENTS', 'ON');
-- Start capturing all Workspace Manager events.
EXECUTE DBMS_WM.SetCaptureEvent ('ALL_EVENTS','ON');
   .
   .
   .
-- Stop capturing all Workspace Manager events.
EXECUTE DBMS_WM.SetCaptureEvent ('ALL_EVENTS','OFF');
-- Disallow capture of Workspace Manager events.
EXECUTE DBMS_WM.SetSystemParameter ('ALLOW_CAPTURE_EVENTS', 'OFF');

2.4 AQ操作とWorkspace Managerイベント

この項では、取得したWorkspace Managerイベントを処理するアプリケーションの開発者に関連するアドバンスト・キューイング・オブジェクトと手法について説明します。

2.4.1 Workspace Managerイベントのキュー管理

Workspace Managerでは、キュー表WMSYS.WM$EVENT_QUEUE_TABLEに基づいてマルチ・コンシューマ・キューWMSYS.WM$EVENT_QUEUEが作成されます。キューのペイロード・タイプは、オブジェクト型であるWMSYS.WM$EVENT_TYPEです。

AQは、管理に使用できるキュー用に複数のビューを作成します。表2-3に、Workspace Managerアプリケーションの開発者にとって重要なビューを示します。

表2-3 AQのWorkspace Manager用管理ビュー

ビュー名 説明

WMSYS.AQ$WM$EVENT_QUEUE_TABLE

イベントが格納されているキュー表の記述が表示されます。このビューを使用してイベントの問合せができます。AQ_ADMINISTRATOR_ROLEロールおよびWM_ADMINシステム権限には、このビューに対する選択権限が付与されています。

WMSYS.AQ$WM$EVENT_QUEUE_TABLE_S

イベント・キューのサブスクライバがすべて表示されます。また、作成時に使用された場合は、サブスクライバの変換も表示されます。AQ_ADMINISTRATOR_ROLEロールおよびWM_ADMINシステム権限には、このビューに対する選択権限が付与されています。

WMSYS.AQ$WM$EVENT_QUEUE_TABLE_R

指定したキュー表にあるキューすべてのルールベース・サブスクライバと、各サブスクライバが定義したルールのテキストのみが表示されます。また、指定された場合は、サブスクライバの変換も表示されます。AQ_ADMINISTRATOR_ROLEロールおよびWM_ADMINシステム権限には、このビューに対する選択権限が付与されています。

2.4.2 キューに対する権限とアクセス制御

データベース管理者は、複数の方法でキューに対する権限とアクセス権を付与できます。次のような使用例が可能です。

  • DBMS_AQADM.GRANT_SYSTEM_PRIVILEGEプロシージャを使用して、データベース・ユーザーにシステム権限ENQUEUE ANY QUEUEおよびDEQUEUE ANY QUEUEを直接付与し、後からオプションでDBMS_AQADM.REVOKE_SYSTEM_PRIVILEGEプロシージャを使用して権限を取り消す方法。

  • DBMS_AQADM.GRANT_QUEUE_PRIVILEGEプロシージャを使用して、データベース・ユーザーにイベント・キューWMSYS.WM$EVENT_QUEUEに対するキュー権限ENQUEUEおよびDEQUEUEを付与し、後からオプションでDBMS_AQADM.REVOKE_QUEUE_PRIVILEGEプロシージャを使用して権限を取り消す方法。

  • データベース・ユーザーにAQ_ADMINISTRATOR_ROLEロールを付与し、そのユーザーにすべてのキューの管理権限を付与する方法。

例2-2に、イベント・キューにサブスクライブしてイベントをデキューするためにユーザーに付与される権限を示します。

例2-2 キューへのアクセス権限の付与

-- Do the following while connected as SYSDBA.
-- These privileges are required for the user to execute AQ packages.
grant execute on DBMS_AQ to SCOTT ;
grant execute on DBMS_AQADM to SCOTT ;

-- Grant privilege to SCOTT for subscribing to the event queue.
exec DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE('MANAGE_ANY','SCOTT') ;

-- Grant privilege to SCOTT to dequeue events. (As an alternative, you could use
-- DBMS_AQADM.GRANT_QUEUE_PRIVILEGE to grant the DEQUEUE privilege on
-- WMSYS.WM$EVENT_QUEUE.)
exec DBMS_AQADM.GRANT_SYSTEM_PRIVILEGE('DEQUEUE_ANY','SCOTT') ;

2.4.3 ルールベースのサブスクリプション

イベントは、イベント・パラメータに基づいて複数の受信者に配信できます。受信対象イベントを指定するためのメカニズムとして、イベント・キューに関するルールベースのサブスクリプションを定義できます。これにより、サブスクライバ・ルールを使用して、イベント配信のために受信者が評価されます。NULLのルールは、サブスクライバが全イベントの受信を必要としていることを示します。

例2-3では、親作業領域がLIVE作業領域の場合に、ユーザーSCOTTがWORKSPACE_MERGE_WO_REMOVEイベントを配信するためのルールベース・サブスクリプションを作成しています。

例2-3 Workspace Managerイベントに関するルールベースのサブスクリプション

rem =================================================
rem Create queue subscribers
rem Register for MergeWorkspace event when
rem a workspace is merged to LIVE
rem =================================================

connect scott
-- Enter password when prompted.

DECLARE
    subscriber sys.aq$_agent;
BEGIN
    subscriber := sys.aq$_agent('MERGE_LISTENER', NULL, NULL);
    dbms_aqadm.add_subscriber(
      queue_name => 'WMSYS.WM$EVENT_QUEUE',
      subscriber => subscriber,
      rule => 'tab.user_data.event_name = ''WORKSPACE_MERGE_WO_REMOVE''
               and tab.user_data.parent_workspace_name = ''LIVE''');
END;
/

2.4.4 イベントのリスニング

リスニング・コールは、キューまたはサブスクリプション・リストにあるイベントの待機に使用できるブロック化コールです。リスニングが正常に戻った場合は、デキューを使用してイベントを取り出す必要があります。

例2-4では、イベント・キューでイベントをリスニングしています。

例2-4 Workspace Managerイベントのリスニング

rem ==============================================================
rem The following example shows how an application can listen for
rem an event. Explicit dequeue must be performed to get the actual
rem event parameters. The user SCOTT must have sufficient privileges 
rem as described in the "Access Control" section.
rem ==============================================================

connect scott
-- Enter password when prompted.

set serveroutput on

DECLARE
 qlist dbms_aq.aq$_agent_list_t;
 agent_w_msg sys.aq$_agent;
 listen_timeout exception;
 pragma exception_init(listen_timeout, -25254);
BEGIN
 qlist(0) := sys.aq$_agent('MERGE_LISTENER', 'WMSYS.WM$EVENT_QUEUE', NULL);

 dbms_output.put_line ('Listening on event queue.');

 BEGIN

 DBMS_AQ.LISTEN(
         agent_list => qlist,
         wait => 30,
         agent =>  agent_w_msg);

         dbms_output.put_line(agent_w_msg.name) ;

         /* The event can be dequeued here to get the event data */

 EXCEPTION
        when listen_timeout THEN
                null;
 END;

END;
/

2.4.5 非同期通知

非同期通知を使用すると、クライアントは必要なイベントの通知を受信できます。この通知を使用して、複数のサブスクリプションを監視できます。クライアントは、データベースに接続しなくても、サブスクリプションに関する通知を受信できます。

アプリケーションがコールバックを使用してWorkspace Managerイベントの非同期通知に登録する場合は、次のようにinit.oraパラメータの最小値を設定する必要があります。

  • aq_tm_processes = 1

  • job_queue_processes = 2

例2-5では、イベントの非同期通知を受信するためにコールバックに登録しています。

例2-5 イベントの非同期通知の受信

rem =====================================================
rem Example of how to register for a callback to the event
rem queue on behalf of a subscriber. Subscriber has already
rem been defined in previous section. The callback is
rem invoked by the AQ framework whenever an event satisfying the
rem rule for the subscriber occurs. The minimum values for
rem the following init.ora parameters should be set as follows.
rem   aq_tm_processes = 1
rem   job_queue_processes = 2
rem The user SCOTT must have sufficient privileges.
rem ===========================================================

CONNECT scott
-- Enter password when prompted.

CREATE TABLE merge_log
(
  event_name      varchar2(128),
  workspace_name  varchar2(128),
  parent_workspace_name varchar2(128),
  user_name       varchar2(128)
);

CREATE OR REPLACE PROCEDURE scott.event_callback(
   context RAW , reginfo sys.aq$_reg_info, descr sys.aq$_descriptor, 
   payload VARCHAR2,  payloadl NUMBER)
AS
    deq_msgid           RAW(16);
    dopt                dbms_aq.dequeue_options_t;
    mprop               dbms_aq.message_properties_t;
    event               WMSYS.WM$EVENT_TYPE;
    no_messages         exception;
    pragma exception_init(no_messages, -25228);

BEGIN
    dopt.consumer_name := 'MERGE_LISTENER';
    dopt.wait := 30;
    dopt.msgid := descr.msg_id;

    dbms_aq.dequeue(
        queue_name => 'WMSYS.WM$EVENT_QUEUE',
        dequeue_options => dopt,
        message_properties => mprop,
        payload => event,
        msgid => deq_msgid);

    INSERT INTO merge_log VALUES (event.event_name, event.workspace_name,
      event.parent_workspace_name, event.user_name);

    /* Note: If there are additional parameters stored in
       "aux_params" attribute, it can be accessed using 
       event.aux_params(1).name, event.aux_params(1).value, 
       event.aux_params(2).name … and so on. The number of 
       parameters can be accessed using event.aux_params.count 
       when aux_params is not null.
     */
END;
/

grant execute on scott.event_callback to public ;

rem ==================================================
rem Register a callback for the event
rem Queue name and subscriber name have to be specified
rem while registering for a callback
rem ==================================================

DECLARE
  reginfo1            sys.aq$_reg_info;
  reginfolist         sys.aq$_reg_info_list;
BEGIN
  reginfo1 := sys.aq$_reg_info('WMSYS.WM$EVENT_QUEUE:MERGE_LISTENER',1,'plsql://scott.event_callback?PR=1',HEXTORAW('FF'));

  reginfolist := sys.aq$_reg_info_list(reginfo1);

  sys.dbms_aq.register(reginfolist, 1);

  COMMIT;

END;
/