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を操作するために作成するフォームのページは、ページ番号が9、データ・ソースの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になります。


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


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


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

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


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


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


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

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

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

この後にShare Linkを作成する際に、Provider NameとShare 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_NAME、P10_SHARE_PROVIDER_NAME、P10_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_PROVIDER、ShareとしてDEMO_SHAREを選択し、対話モード・レポートShare LinksにあるボタンCreateをクリックします。


Link NameにSALES_DATAを入力します。Share Provider NameにはDEMO_PROVIDER、Share 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_NAMEとP11_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 NameはCUSTSALES_SHARE_Vとします。Share Link NameとしてSALES_DATA、Share Schema NameとしてWKSP_DWAPEX、Share Table NameとしてCUSTSALESを順番に選択します。

作成をクリックします。


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


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

select * from custsales_share_v


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

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

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

完