今回はロールHR_ROLEを作成しユーザーAPEXDEVに割り当てています。スキーマHRの表EMP, DEPTおよびビューEMP_DEPT_Vへのアクセス権限をこのロールに与えていますが、権限が適切に割り当たっているか、不要な権限が割り当たっていないかを確認します。
権限の使用状況を確認するために、権限分析(Privilege Analysis)を実施します。
権限分析ポリシーをapex_captureとして作成します。データベース・アクションにユーザーADMINで接続して実行します。プロシージャDBMS_PRIVILEGE_CAPTURE.CREATE_CAPTUREを呼び出します。
確認した範囲では、APEXアプリケーションからのアクセスがキャプチャされるのは、typeがdbms_privilege_capture.g_databaseのときだけでした。
ビューDBA_PRIV_CAPTURESから、作成した権限分析ポリシーを確認します。
この時点ではキャプチャは開始されていません。プロシージャDBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTUREを呼び出し、キャプチャを開始します。
キャプチャを開始したので、APEXアプリケーションより実施する可能性のある操作をすべて実施します。表HR.EMPへ新規行の追加、更新、削除を行います。
キャプチャを停止します。プロシージャDBMS_PRIVILEGE_CAPTURE.DISABLE_CAPTUREを呼び出します。
今までキャプチャした内容から、権限分析レポートを生成します。プロシージャDBMS_PRIVILEGE_CAPTURE.GENERATE_RESULTを呼び出します。終了までに、それなりの時間がかかります。
操作で使用された権限は、ビューDBA_USED_PRIVSより確認することができます。
以下のような結果が得られます。
使用されなかった権限はビューDBA_UNUSED_PRIVSより確認できます。
以下のような結果が得られます。
今回の例ではAPEXアプリケーションより表DEPTを編集することはないため、SELECT以外の権限は不要です。SELECT以外の権限を表HR.DEPTより除いてみます。
run_nameを変更してキャプチャし直すこともできますが、今回は、生成したレポートを削除して再実行します。プロシージャDBMS_PRIVILEGE_CAPTURE.DELETE_RUNを呼び出します。
再度、DBMS_PRIVILEGE_CAPTURE.ENABLE_CAPTURE、APEXアプリケーションの操作、DBMS_PRIVILEGE_CAPTURE.DISABLE_CAPTURE、そしてDBMS_PRIVILEGE_CAPTURE.GENERATE_RESULTを繰り返します。
ビューDBA_UNUSED_PRIVSを確認すると、表DEPTに対する未使用権限はSELECTのみになっています。
権限分析ポリシーを削除するには、プロシージャDBMS_PRIVILEGE_CAPTURE.DROP_CAPTUREを呼び出します。