Oracle APEXのアプリケーションが変更されていないことを確認するには、どのような方法があるでしょう?と相談を受けたので、ちょっと考えてみました。
Oracle APEXのアプリケーションを構成しているページ、リージョン、ページ・アイテムなどはすべてAPEXアプリケーション・ビューを通して情報を得ることができます。
アプリケーション・ビルダーのApplication Expressビューから参照できます。
ビューからは、アプリケーションを構成している情報以外にも、稼働ログ、ワークスペース、登録されているユーザーやロールなども参照できます。
以下の手順で、APEXの変更を検知してみます。
- APEXの標準ビューの内容を実表にコピーする。
- コピーした実表とAPEXの標準ビューを比較する。
APEXの標準ビューをコピーするために、以下のPL/SQLスクリプトを書きました。
実行すると、APEX_ で始まるビューを、B001_で始まる表にコピーします。CTAS(CREATE TABLE AS SELECT)を実行しています。
続いて作成した表とAPEX標準ビューを比較します。以下のPL/SQLスクリプトを書きました。
APEXのアプリケーションは何も変更せずに上記のスクリプトを実行すると、以下の結果が返りました。
something changed B001_ACTIVITY_LOG something changed B001_WORKSPACES something changed B001_WORKSPACE_ACCESS_LOG something changed B001_WORKSPACE_LOG_SUMMARY something changed B001_WORKSPACE_LOG_SUMMARY_USR something changed B001_WORKSPACE_SESSIONS
変更が検知されたのはログが書き込まれたり、利用状況によって更新される値を含んでいるビューです。変更の検知を確認するために、APEX標準ビューから表へコピーする対象に含めていましたが本来は対象から外すべきです。
このままでは結構な負荷になるため、ログ以外にも色々なビューを比較の対象から外す必要はあります。とはいえ、APEXアプリケーションの変更を検知する実装としての方向性は正しいと思います。データの変更を検知できているためです。
作成した表を削除するために、以下のスクリプトを書きました。
また、ビューAPEX_DICTIONARYよりビューの親子関係を確認できます。Application Expressビューのツリー・ビューの元になっている情報です。
上記の階層構造を検索しているSQLを簡略化すると、以下になります。
親となっているビューAPEX_APPLICATIONSへの行の追加、削除(更新は除く)については、APEX_APPLICATIONSを親としているビューに含まれている詳細情報を確認する必要はありません。それらはアプリケーションが追加されている場合は、詳細情報もすべて追加になります。アプリケーションが削除された場合は詳細情報もすべて削除されています。
データベースのディクショナリ、ビューAPEX_DICTIONARY共に、どれがユニークなカラムを示す情報がありません。そのため、挿入、削除、更新があったことは検出できますが、挿入、削除、更新のどの操作があったのか、特に更新の検出が困難です。
それぞれのビューのユニークな列を示す情報を別に用意する必要があります。
Oracle APEXを利用する際の参考になれば幸いです。
完