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の際の対応については以上になります。

2024年7月11日木曜日

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

Delta SharingのConsumer側の実装を行います。主にLiveLabsのImplement Data Sharing with PL/SQLのLab 5の作業に相当します。

Providerを実装したインスタンスとは異なるインスタンスで、最初の記事の準備作業を行います。準備作業の結果としてAlways FreeのAutonomous Data WarehouseにAPEXのワークスペースdwapex、ワークスペース・スキーマwksp_dwapex、クリデンシャルSHARE_BUCKET_CREDENTIALは作成済みとします。また、DBMS_SHARE.ENABLE_SHARE、DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACEも実行済みとします。

Providerの記事で作成したAPEXアプリケーションをエクスポートし、Consumerを実装するインスタンスのAPEXワークスペースにインポートします。

インポートしたAPEXアプリケーションのConsumerのページに、以下の処理を組み込みます。
  1. Delta Sharingのプロファイルよりクリデンシャルを作成
  2. Share Providerを作成し、クリデンシャルを紐付け
  3. 利用可能なShareの一覧
  4. 利用可能なShare Tableの一覧
  5. Share Linkの作成、削除
  6. Share Link Viewの作成
以下より実装を進めます。

ページ・デザイナでConsumerのページを開きます。

Share Providerを一覧する対話モード・レポートShare Providersを作成します。ソースSQL問合せは以下になります。

select * from user_share_providers


Share Providerを操作するために作成するフォームのページは、ページ番号データ・ソースSQLには以下を記述します。
select
    provider_id,
    provider_name,
    '' delta_sharing_profile
from user_share_providers
主キー列1にはPROVIDER_IDを選択します。


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

ページ・アイテムP9_PROVIDER_NAME識別タイプテキスト・フィールドに変更します。


ページ・アイテムP9_DELTA_SHARING_PROFILE識別タイプテキスト領域に変更します。検証最大長4000に変更します。


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

プロセスCreateでは、以下のコードを実行します。ボタンCREATEの押下で実行します。



プロセスDeleteでは、以下のコードを実行します。ボタンDELETEの押下で実行します。
begin
    dbms_share.drop_share_provider(
        provider_name => :P9_PROVIDER_NAME
    );
end;

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

Consumerのページに戻り対話モード・レポートShare Providersに、ボタンCREATE_SHARE_PROVIDERを作成します。ターゲットページ9になります。


属性リンク列カスタム・ターゲットへのリンクとし、ターゲットはページ、主キーのアイテムの名前としてP9_PROVIDER_IDとなる列に\#PROVIDER_ID#\を指定します。


ダイアログがクローズしたときに対話モード・レポートShare Providersリフレッシュする動的アクションを作成します。識別名前onClose Dialog Share Providerとします。


以上でShare Providersについて出来上がりました。動作を確認してみます。

アプリケーションを実行し、対話モード・レポートShare ProvidersにあるボタンCreateをクリックします。


Provider Name
DEMO_PROVIDERDelta Sharing ProfileにProvider側で発行したDelta Sharingのプロファイル(JSONドキュメント)を貼り付け、作成をクリックします。


Share ProviderとしてDEMO_PROVIDERが作成されます。


Providerに含まれるShareを選択し、共有可能な表の一覧を表示します。

最初にProviderを選択するページ・アイテムを作成します。

識別名前P3_PROVIDER_NAMEタイプ選択リストとします。ラベルProviderとします。設定選択時のページ・アクションとして値のリダイレクトと設定を選択します。

この後にShare Linkを作成する際に、Provider NameShare Nameがその引数となります。ターゲットに設定した置換文字列ページ・レンダリング時セッション・ステートに保存されている値で置き換えられるため、選択時のページ・アクションとして値のリダイレクトと設定を選び、値をセッション・ステートに保存した後にリダイレクトを発生させ、ページのレンダリングが行われるようにします。


LOVタイプSQL問合せSQL問合せとして以下を記述します。

select provider_name d, provider_name r from user_share_providers

追加値の表示オフNULL値の表示オンNULL表示値- Select Provider -とします。

詳細保存されていない変更の警告無視にします。セッション・ステートストレージセッションごと(永続)を選択します。


Providerに含まれるShareから、Shareをひとつ選択するページ・アイテムを作成します。

識別名前P3_SHARE_NAMEタイプ選択リストとします。ラベルShareとします。設定選択時のページ・アクションとして値のリダイレクトと設定を選択します。P3_PROVIDER_NAMEの右隣に配置するため、レイアウト新規行の開始オフにします。


LOVタイプSQL問合せSQL問合せとして以下を記述します。
select available_share_name d, available_share_name r
from dbms_share.discover_available_shares(
    coalesce(:P3_PROVIDER_NAME,'DUMMY')
)
追加値の表示オフNULL値の表示オンNULL表示値- Select Share -とします。

選択可能なShareはProviderに依存するため、カスケードLOV親アイテムとしてP3_PROVIDER_NAMEを指定し、親が必要オンにします。

詳細保存されていない変更の警告無視にします。セッション・ステートストレージセッションごと(永続)を選択します。


共有可能な表を一覧する対話モード・レポートAvailable Tables (Named)を作成します。

ソースSQL問合せとして以下を記述します。share_provider、share_nameともにnullの場合は、全件が検索対象になります。
select * from dbms_share.discover_available_tables(
    share_provider => :P3_PROVIDER_NAME
    ,share_name => :P3_SHARE_NAME
)

アプリケーションを実行して動作を確認します。

Provider側で作成したShareのDEMO_SHAREに追加された表CUSTSALESが一覧されます。


Share Link作成削除を行なう機能を実装します。

作成する対話モード・レポートShare LinksソースSQL問合せは以下になります。

select * from user_share_links


Share Linkの作成と削除をするフォームのページは、ページ番号10名前Share Linkデータ・ソースSQLには以下を記述します。
select
    link_id,
    link_name,
    share_provider_name,
    share_name
from user_share_links
主キー列1にはLINK_IDを選択します。


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

ページ・アイテムP10_LINK_NAMEP10_SHARE_PROVIDER_NAMEP10_SHARE_NAMEタイプテキスト・フィールドに変更します。


Share Linkの作成、削除を行なうプロセスを作成します。デフォルトで作成されているプロセスプロセス・フォームShare Linkコメント・アウトします。

プロセスCreateでは、以下のコードを実行します。ボタンCREATEの押下で実行します。
begin
    dbms_share.create_or_replace_share_link(
        share_link_name => :P10_LINK_NAME
        ,share_provider => :P10_SHARE_PROVIDER_NAME
        ,share_name => :P10_SHARE_NAME
    );
end;

プロセスDeleteでは、以下のコードを実行します。ボタンDELETEの押下で実行します。
begin
    dbms_share.drop_share_link(
        link_name => :P10_LINK_NAME
    );
end;

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

Consumerのページに戻り対話モード・レポートShare Linkに、ボタンCREATE_SHARE_LINKを作成します。ターゲットページ10になります。


ターゲットの設定では、名前P10_SHARE_NAMEに値\&P3_SHARE_NAME.\、名前P10_SHARE_PROVIDER_NAMEに値\&P3_PROVIDER_NAME.\を渡すことにより、現在Consumerのページで選択されているProviderとShareを、Share Linkを作成する際のデフォルト値としています。


属性リンク列カスタム・ターゲットへのリンクとし、ターゲットページ10、主キーのアイテムの名前としてP10_LINK_IDとなる列に\#LINK_ID#\を指定します。


ダイアログがクローズしたときに対話モード・レポートShare Linksリフレッシュする動的アクションを作成します。識別名前onClose Dialog Share Linkとします。


以上でShare Linksについて出来上がりました。動作を確認してみます。

アプリケーションを実行ます。

ProviderとしてDEMO_PROVIDERShareとしてDEMO_SHAREを選択し、対話モード・レポートShare LinksにあるボタンCreateをクリックします。


Link NameSALES_DATAを入力します。Share Provider NameにはDEMO_PROVIDERShare NameにはDEMO_SHAREが入力済みです。

作成をクリックします。


Share LinkとしてSALES_DATAが作成されます。


最後にShare Link Viewの一覧と作成を実装します。

Share Link Viewを一覧する対話モード・レポートShare Link Viewsを作成します。ソースSQL問合せは以下になります。

select * from user_share_link_views


Share Link Viewを作成するフォームのページは、ページ番号11データ・ソースSQLには以下を記述します。
select
    '' id,
    view_name,
    link_name share_link_name,
    share_schema_name,
    share_table_name
from user_share_link_views
主キー列1にはIDを選択します。


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

ページ・アイテムP11_VIEW_NAME識別タイプテキスト・フィールドに変更します。


ページ・アイテムP11_SHARE_LINK_NAME識別タイプ選択リストに変更します。

LOVタイプSQL問合せとし、SQL問合せに以下を記述します。

select link_name d, link_name r from user_share_links

追加値の表示オフNULL値の表示オンNULL表示値- Select Share Link -と記述します。


ページ・アイテムP11_SHARE_SCHEMA_NAME識別タイプ選択リストに変更します。

LOVタイプSQL問合せとし、SQL問合せに以下を記述します。
select schema_name d, schema_name r from dbms_share.discover_available_tables(
    share_name => (
        select share_name from user_share_links where link_name = :P11_SHARE_LINK_NAME
    )
)
追加値の表示オフNULL値の表示オンNULL表示値- Select Shema -と記述します。

カスケードLOV親アイテムP1_SHARE_LINK_NAMEを指定し、親が必要オンにします。


ページ・アイテムP11_SHARE_TABLE_NAME識別タイプ選択リストに変更します。

LOVタイプSQL問合せとし、SQL問合せに以下を記述します。
select table_name d, table_name r from dbms_share.discover_available_tables(
    share_name => (
        select share_name from user_share_links where link_name = :P11_SHARE_LINK_NAME
    )
)
where schema_name = :P11_SHARE_SCHEMA_NAME
追加値の表示オフNULL値の表示オンNULL表示値- Select Table -と記述します。

カスケードLOV親アイテムP11_SHARE_LINK_NAMEP11_SHARE_SCHEMA_NAMEを指定し、親が必要オンにします。


Share Link Viewを作成するプロセスを作成します。作成されたShare Link Viewはビューなので、DROP VIEWコマンドで削除できます。そのため、このアプリケーションでは作成のみを実装します。デフォルトで作成されているプロセスプロセス・フォームShare Link Viewコメント・アウトします。

プロセスCreateでは、以下のコードを実行します。ボタンCREATEの押下で実行します。
begin
    dbms_share.create_share_link_view(
        view_name => :P11_VIEW_NAME
        ,share_link_name => :P11_SHARE_LINK_NAME
        ,share_schema_name => :P11_SHARE_SCHEMA_NAME
        ,share_table_name => :P11_SHARE_TABLE_NAME
    );
 end;

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

Consumerのページに戻り対話モード・レポートShare Link Viewsに、ボタンCREATE_SHARE_LINK_VIEWを作成します。ターゲットページ11になります。


ダイアログがクローズしたときに対話モード・レポートShare Link Viewsリフレッシュする動的アクションを作成します。識別名前onClose Dialog Share Link Viewとします。


以上でShare Link Viewについて出来上がりました。

これでDelta Sharingによるデータ共有の実装は、すべて完了です。

アプリケーションを実行し、対話モード・レポートShare Link ViewsにあるボタンCreateをクリックします。


Link NameCUSTSALES_SHARE_Vとします。Share Link NameとしてSALES_DATAShare Schema NameとしてWKSP_DWAPEXShare Table NameとしてCUSTSALESを順番に選択します。

作成をクリックします。


ビューCUSTSALES_SHARE_Vが作成されます。


SQLコマンドより、ビューCUSTSALES_SHARE_Vを検索します。

select * from custsales_share_v


Provider側に存在していた表CUSTSALESを、Delta Sharingを使って、別インスタンスのConsumerから参照することができました。

今回のシリーズ記事は以上になります。

Oracle APEXのアプリケーション作成の参考になれば幸いです。