2021年9月9日木曜日

Autonomous Database上のAPEXアプリケーションでSQLトレースを取得する

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