2022年8月30日火曜日

APEXアプリケーションの変更点を調べる

 APEXアプリケーションの変更(コンポーネントの作成、変更、削除)は、管理メニューのアクティビティのモニターを開いた画面にある、開発者アクティビティアプリケーション変更(詳細)から確認することができます。

デフォルトではいくつかの列が非表示になっています。すべて表示させると以下のレポートになります。一覧される履歴を制限するために、期間アプリケーションによる絞り込みを行うと良いでしょう。日付の降順で一覧すると見やすくなると思います。

このレポートに列として、APEX表名SCNおよびコンポーネント・キーが含まれています。

Autonomous Databaseの場合、APEXがインストールされているスキーマが保護されているため、APEX表に直接アクセスすることはできません。すべて標準ビューを介してのアクセスになるため、これから説明する作業はできません。

誰が何をいつ変更したか、といったことはAutonomous Databaseでも、上記のレポートより確認できます。いつ、についてはSCNより正確な時刻を割り出すことも可能です。

select scn_to_timestamp(<SCN>) at time zone 'Asia/Tokyo' from dual;

オンプレミス環境の場合、APEX表に直接問い合わせを発行できるため、実施された変更を確認できます。

アクション作成および削除であれば、コンポーネント(の種類)とコンポーネント名から概ね実行された作業は分かります。そのため、詳細まで調べる必要性はあまりないかと思います。

以下は、アクション変更のときの確認手順です。

例としてアプリケーションID110ページ番号3のページにあるファセットP3_MGRラベルを、マネージャーから上司に変更し保存します。


アプリケーションの変更のレポートを確認すると、変更履歴が見つかります。変更されたAPEX表名として、WWV_FLOWS_STEPSとWWV_FLOW_STEP_ITEMSがあります。


コマンドライン・ツールでデータベースに接続します。

APEXがインストールされているスキーマをカレント・スキーマに変更します。APEX 22.1の場合はAPEX_220100がAPEXがインストールされているスキーマになります。

SQL> alter session set current_schema = apex_220100;


Session altered.


SQL> 


現在のデータと変更前のデータを、別の表に保存します。APEX表名SCNコンポーネント・キーの値を使い、以下のCREATE TABLE文を実行します。

CREATE TABLE <変更後の表> AS SELECT * FROM <APEX表名> where ID = <コンポーネント・キー>;
CREATE TABLE <変更前の表> AS SELECT * FROM <APEX表名> as of scn <列SCNの値> where ID = <コンポーネント・キー>;

APEXのワークスペース・スキーマとして、APEXDEVが作成済みであるとします。

上記のDDLを実行して、表を作成します。変更後のアイテムのデータを表STEP_ITEMS_AC変更前STEP_ITEMS_BC変更後のページのデータを表STEPS_AC変更前STEPS_BCに保存しています。

SQL> create table apexdev.step_items_ac as select * from wwv_flow_step_items where id = 4025742564048869;


Table created.


SQL> create table apexdev.step_items_bc as select * from wwv_flow_step_items as of scn 3874676 where id = 4025742564048869;


Table created.


SQL> create table apexdev.steps_ac as select * from wwv_flow_steps where flow_id = 110 and id = 3;


Table created.


SQL> create table apexdev.steps_bc as select * from wwv_flow_steps as of scn 3874678 where flow_id = 110 and id = 3;


Table created.


SQL> 


APEX表は大抵列ID が主キーで、コンポーネント・キーで検索すると1行だけが返されます。ただし、表WWV_FLOW_STEPS(これはページのメタデータ)は例外で、アプリケーションIDであるFLOW_IDとページIDであるIDの複合主キーなので、FLOW_IDとIDを検索条件にします。

変更前の情報の検索には、フラッシュバック問い合わせ(AS OF SCN)を使っています。そのため、初期化パラメータのundo_retentionの期間内に検索を実行する必要があります。

APEXのアプリケーションを作って、変更後と変更前の表の違いを確認します。

アプリケーションのページにクラシック・レポートのリージョンを2つ作成します。ひとつはソース表名変更後の表STEP_ITEMS_ACを指定します。もうひとつはソース表名変更前の表STEP_ITEMS_BCを指定します。リージョンの配置を横並びにするため、変更前のリージョンのレイアウト新規行の開始OFFにします。


クラシック・レポートの属性を開き、外観テンプレートとしてValue Attribute Pairs - Columnを選択します。列と値を縦方向に一覧表示します。


以上の設定を行い、アプリケーションを実行します。


Promptマネージャーから上司に変更されていることが確認できます。


変更後の列Last Updated ByとLast Updated Onより、変更した人と時刻を確認できます。


変更履歴には表WWV_FLOW_STEPSへの変更がレポートされています。しかし、表WWV_FLOW_STEP_ITEMSと同様の手順で変更内容を確認すると、メタデータには変更は見つかりませんでした。変更したのはファセットのラベルだけなので、これは想定通りです。列Last Updated ByとLast Updated Onのみが変更されています。


APEXアプリケーションの変更点を調べる方法の紹介は以上になります。

ちなみにアプリケーションの変更履歴はAPEX表WWV_FLOW_BUILDER_AUDIT_TRAILに保存されています。この表にはビューやシノニムは登録されていないため、ユーザーSYSやSYSTEMのみがアクセスできます。Autonomous Databaseの場合は管理者ユーザーのADMINであってもアクセスできません。必ずアクティビティのモニターを開いて確認する必要があります。

WWVで始まるAPEX表を直接問い合わせることは、サポート対象外です。そのため取得した情報の扱いは、参考程度にとどめておくべきです。APEXアプリケーションのメタデータを参照する場合は、APEX_で始まる標準ビューを使用します。