以前にも同じテーマで記事を書いているのですが、 SQLトレースの保存先に事前承認リクエストではなくクリデンシャルを使う、APEXのアプリケーションでSQLトレースを有効にするために、セキュリティの設定ではなくプロセスを作成するようしました。
以下、SQLトレースを取得する手順を紹介します。
認証トークンの生成
手順を簡素にするため、グループAdministratorsに含まれているユーザーで認証トークンを生成します。できれば、ユーザー、グループ、ポリシーの作成を検討しましょう。
OCIコンソールよりアイデンティティのユーザーから、ユーザーの詳細を開きます。リソースより認証トークンを選択します。
トークンの生成を実行します。
説明を入力し、トークンの生成を実行します。
トークンが生成されるので、コピーします。この値はAutonomous Databaseにクリデンシャルを作成する際に使用します。
閉じるをクリックします。
オブジェクト・ストレージのバケットの作成
OCIコンソールよりオブジェクト・ストレージのバケットを開きます。バケットの作成を実行します。
バケット名を指定して、作成を実行します。今回はバケット名をsql_traceとしています。
バケットsql_traceが作成されます。作成されたバケットを開きます。
作成したバケットのパスを確認します。小さなファイルをバケットにアップロードして、オブジェクト詳細の実行を行います。
URLパス(URI)として表示されているパスの、ファイルの名前を除いた/o/までをコピーします。コピーしたら取消をクリックして、ドロワーを閉じます。
以上で、SQLトレースの出力先の準備はできました。
Autonomous Databaseの設定
管理者ユーザーADMINにてデータベース・アクションに接続し、SQLを開きます。
以下のコマンドを実行しクリデンシャルDEF_CRED_NAMEを作成します。
BEGIN
DBMS_CLOUD.CREATE_CREDENTIAL(
credential_name => 'DEF_CRED_NAME',
username => 'ユーザー名',
password => '生成した認証トークン'
);
END;
/
SQLトレースの出力先を、データベース・プロパティDEFAULT_LOGGING_BUCKETとして設定します。
SET DEFINE OFF;
ALTER DATABASE PROPERTY SET
DEFAULT_LOGGING_BUCKET = 'https://objectstorage.リージョン.oraclecloud.com/n/ネームスペース/b/sql_trace/o/';
デフォルトで使用するクリデンシャルとして、先ほど作成したDEF_CRED_NAMEを設定します。スキーマ名のADMINをつける必要があります。
ALTER DATABASE PROPERTY SET DEFAULT_CREDENTIAL = 'ADMIN.DEF_CRED_NAME';
APEXのワークスペース・スキーマでSQLトレースを有効にできるよう、ALTER SESSIONを実行する権限を与えます。ワークスペース・スキーマがAPEXDEVの例です。
grant alter session to apexdev;
Autonomous Databaseの設定は以上で完了です。
APEXアプリでのSQLトレースの有効化
APEXアプリケーションでSQLトレースを取る処理の前に、以下のコードを実行するプロセスを作成します。
execute immediate 'alter session set sql_trace = true';
ページのレンダリング全体のSQLトレースを取得する場合は、レンダリング前にプロセスを配置します。
execute immediate 'alter session set sql_trace = false';
レンダリング前にSQLトレースを開始した場合は、レンダリング後にSQLトレースを停止します。
セッションのClient IdentifierやModuleの情報は、APEXによって設定されているので、設定しない方がよいでしょう。
変更したAPEXのアプリケーションを実行すると、SQLトレースがオブジェクト・ストレージに出力されます。サーバー側の条件などを組み合わせると、より効果的にSQLトレースが取得できると思います。
出力されたSQLトレースの確認
SQLトレースの出力先として指定したバケットの内容を確認します。
サインインしたユーザー、セッションID、ワークスペース、アプリケーションIDやページ番号で分類されたフォルダの下に、SQLトレースが出力されています。
Oracle APEXのアプリケーション開発の参考になれば幸いです。
完