2024年7月12日金曜日

Delta Sharingを使ってインスタンスが異なるAPEXワークスペース間でデータを共有する (4) - LIVE

ShareのTypeがLIVEのときは、Delta SharingではなくCloud Linkを使って、データの共有を行います。記事のタイトルと内容が合っていませんが、以下よりShareのTypeがLIVEのときの対応について記載します。

作業は、以下のLiveLabsのインストラクションに従っています。
Set up live data sharing between Oracle Databases using Cloud Links and PL/SQL APIs
https://apexapps.oracle.com/pls/apex/r/dbpm/livelabs/view-workshop?wid=3881

最初にProvider側の変更を行います。

ページ番号7Share RecipientRecipient Sharing IDの扱いを追加します。

ソースSQL問合せに列RECIPIENT_SHARING_IDを追加します。
select
    recipient_id,
    recipient_name,
    recipient_sharing_id,
    '' email,
    '' recipient_property,
    '' new_value
from user_share_recipients

フォーム・リージョンShare Recipientページ・アイテムの同期化を実行します。


追加されたページ・アイテムP7_RECIPIENT_SHARING_IDタイプテキスト・フィールドに変更します。


プロセスCreateソースPL/SQLコードを以下に変更します。ページ・アイテムP7_RECIPIENT_SHARING_IDConsumerのSharing IDが入力されている場合は、その値を使ってShare Recipientを作成します。
begin
    if :P7_RECIPIENT_SHARING_ID is null then
        /* for VERSIONED - Delta Sharing */
        dbms_share.create_or_replace_share_recipient(
            recipient_name => :P7_RECIPIENT_NAME
            ,email => :P7_EMAIL
        );
    else
        /* for LIVE - Cloud Link */
        dbms_share.create_or_replace_share_recipient(
            recipient_name => :P7_RECIPIENT_NAME
            ,sharing_id => :P7_RECIPIENT_SHARING_ID
        );
    end if;
end;

ページ・アイテムP7_RECIPIENT_SHARING_IDに指定する値は、Consumer側のデータベース・アクションに管理者ADMINで接続し、以下のSQLを実行して取得します。

SELECT dbms_share.get_sharing_id FROM dual;


LiveLabsのLab 4, Task 1のdbms_share.create_share_recipientを呼び出すコードの引数sharing_idの値に「Enter your share provider user sharing id here」と記載されていますが、providerではなくconsumerではないかと思います。

Provider側の変更は以上です。

Consumer側の変更を行います。最初に確認作業を実施します。

LiveLabsのLab 5, Task 2では、DBMS_SHARE.ENABLE_SCHEMAの引数privilegesdbms_share.PRIV_CONSUME_ORACLE_SHAREを指定するように指示されていますが、リファレンスによると「引数をNULLのままにすると、デフォルトでPRIV_CREATE_SHARE + PRIV_CREATE_RECIPIENT + PRIV_CONSUME_ORACLE_SHAREになります。」と記載されているため、すでにデフォルトで共有を有効にしている場合は不要な作業と思われます。

SQLコマンドで以下のSQLを実行し、APEXのワークスペースでCloud Linkによるデータ共有が許可されていることを確認します。

SELECT SYS_CONTEXT('USERENV','CLOUD_LINK_READ_ENABLED') FROM dual;

YESが返されれば許可されています。


Consumer側の設定は異なる点が多いため、新しくページを作成して実装します。

空白のページを作成します。ページ番号12名前Live Consumerとします。


作成されたLive Consumerのページに、利用可能なAvailable Oracle Share Providerを一覧する対話モード・レポートを作成します。ソースSQL問合せは以下になります。

select * from all_available_oracle_share_providers


アプリケーションを実行すると、対話モード・レポートに以下のように利用可能なOracle Share Providerが現れます。


Oracle Share Providerを作成するフォームのページは、ページ番号13データ・ソースSQLには以下を記述します。
select
    oracle_provider_id,
    '' provider_name
from all_available_oracle_share_providers
主キー列1にはORACLE_PROVIDER_IDを選択します。


フォームのページOracle Share Providerが作成されます。

ページ・アイテムP13_PROVIDER_NAMEを選択します。外観テンプレートRequired - Floating検証必須の値オンにします。


Oracle Share Providerを作成するプロセスを作成します。デフォルトで作成されているプロセスプロセス・フォームOracle Share Providerコメント・アウトします。

プロセスCreateでは、以下のコードを実行します。ボタンSAVEの押下で実行します。
begin
    dbms_share.create_oracle_share_provider(
        oracle_provider_id => :P13_ORACLE_PROVIDER_ID
        ,provider_name => :P13_PROVIDER_NAME
    );
end;


以上でフォームについては完成です。

Live Consumerのページに戻ります。

対話モード・レポートAvailable Oracle Share Providers属性リンク列カスタム・ターゲットへのリンクとし、ターゲットページ13、主キーのアイテムの名前としてP13_ORACLE_PROVIDER_IDとなる列に\#ORACLE_PROVIDER_ID#\を指定します。


以上で出来上がりです。

アプリケーションを実行し、対話モード・レポートAvailable Oracle Share Providersから共有する対象となるOracle Share Providersを開きます。


Provider NameDEMO_LIVE_PROVIDERを入力し、変更の適用をクリックします。


Consumerのページを開きます。

Share Providersに作成したOracle Share ProviderDEMO_LIVE_PROVIDERが表示されていることが確認できます。


これ以降のShare LinkおよびShare Link Viewの作成手順は、Delta Sharingのときの作業と同じです。

最終的にShare Link ViewとしてCUSTSALES_SHARE_Vを作成します。


SQLコマンドより作成したビューCUSTSALES_SHARE_Vを検索してみます。

select * from custsales_share_v;


オブジェクト・ブラウザよりビューCUSTSALES_SHARE_VDDLを確認します。

ビューCUSTSALES_SHARE_Vは、Cloud Linkを参照していることがわかります。


Share TypeがLIVEの際の対応については以上になります。