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のアプリケーション作成の参考になれば幸いです。