Autonomous DatabaseでSQLトレースを取得することができるようになったようです。APEXのアプリケーションのSQLトレースを取る方法を確認してみました。
ルート・コンパートメント直下に、SQLトレースのファイルを保存するバケットを作成することにしました。もちろん、バケットはどこに作成しても構いません。
オブジェクト・ストレージの管理画面を開いて、バケットの作成をクリックします。
バケット名はsql-traceとします。デフォルト・ストレージ層として標準を選んで、作成をクリックします。
SQLトレースの出力が確認できればよいだけなので、事前承認リクエストの作成を行います。
事前承認済リクエスト・ターゲットとしてバケットを選びます。アクセス・タイプとしてオブジェクトの書込みを許可を選択します。名前と有効期限をそれぞれ設定し、事前承認済リクエストの作成をクリックします。
生成された事前承認済リクエストのURLをクリップボードにコピーしておきます。閉じるをクリックして、ダイアログを閉じます。
これでオブジェクト・ストレージの用意は完了です。
ユーザーADMINにてデータベース・アクションに接続し、開発のSQLを開きます。以下のSQLを実行します。
set define off;
ALTER DATABASE PROPERTY SET DEFAULT_LOGGING_BUCKET = '事前承認済リクエストのURL';
Oracle APEXに作成したワークスペースのスキーマがAPEXDEVと仮定して、そのスキーマでALTER SESSION文の実行ができるように権限を与えます。
grant alter session to apexdev;
APEXのアプリケーション・ビルダーに移り、SQLトレースを取得したいアプリケーションのアプリケーション定義のセキュリティのタブを開きます。
データベース・セッションの初期化PL/SQLコードで、SQL_TRACEを有効にします。
execute immediate 'alter session set sql_trace = true';
PL/SQLコードのクリーンアップで、SQL_TRACEを無効にします。
execute immediate 'alter session set sql_trace = false';
以上を記述して、変更の適用を行います。
以上の設定を行なった後APEXアプリケーションを実行すると、SQLトレースがオブジェクト・ストレージに保存されます。オブジェクト・ストレージ上のファイルを確認してみます。
Oracle APEXのアプリケーションによって、データベースのセッションにクライアントIDやモジュールが設定されるため、開発者がそれらを設定する必要はありません。
マニュアルによるとclientIDの後にmoduleNameが続くことになっていますが、APEXのアプリケーションから生成されたSQLトレースでは、その間にデータベース・ユーザーが入っています。これは、APEX固有になるのかマニュアルの記載が違うのかは分かりません。データベース・ユーザー名がパスに含まれていても、特に問題は無いでしょう。
APEXアプリケーションでSQLトレースを取得する場合は、ビューSESSION_CLOUD_TRACEを検索する機会はほとんどないと思います。APEXの場合は、ページをリクエストするごとに異なるデータベース・セッションが割り当たるためです。
以上でAutonomous DatabaseでのOracle APEXアプリケーションで、SQLトレースを取得する方法の紹介は終了です。
Oracle APEXのアプリケーション作成の参考になれば幸いです。
完