5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

統合監査:監査ポリシーにスキーマ内の表を一括追加&新規に追加された表を監査ポリシーに自動的に追加する

5
Last updated at Posted at 2026-08-14

はじめに

Autonomous AI Databaseで統合監査をご利用予定のお客様から、「あるスキーマ内の既存の表を一括で監査ポリシーに追加したい。ポリシーの作成後に作成された表も監査対象として同じポリシーに追加したい。」というお話があったので、その実現が可能かを検証してみました。

ここでは、データベーストリガーを使用した方法を検証してみました。

ただし、直接トリガー内で監査ポリシーへの監査対象の追加(ALTER AUDIT POLICY)を行うことができないので、監査対象の追加(ALTER AUDIT POLICY)を実行するDBMS_SCHEDULERジョブを実行するPL/SQLプロシージャを作成し、表が追加された時に実行されるトリガーからそのPL/SQLプロシージャを実行するような構成としました。

注意
こちらの記事の内容はあくまで個人のメモ的な内容のため、こちらの内容を利用した場合のトラブルには一切責任を負いません。
また、こちらの記事の内容を元にしたOracleサポートへの問い合わせはご遠慮ください。

0.既存表の確認

user_tablesビューで、スキーマ内の既存の表を確認します。

SQL> SELECT table_name FROM user_tables
  2  ORDER BY table_name;

TABLE_NAME
--------------------------------------------------------------------------------
TAB1
TAB2
TAB3
TAB4
TAB5
TAB6
TAB7
TAB8
TAB9

9 rows selected.

SQL>

1. 監査ポリシーの作成

スキーマ内の1つの表を対象にした監査ポリシーschema_all_policyを作成します。

SQL> CREATE AUDIT POLICY schema_all_policy ACTIONS ALL ON admin.tab1;

Audit policy created.

SQL>

audit_unified_policiesビューで、作成した監査ポリシーschema_all_policyの監査対象を確認します。

SQL> SELECT * FROM audit_unified_policies
  2  WHERE policy_name = 'SCHEMA_ALL_POLICY';

POLICY_NAME
--------------------------------------------------------------------------------
AUDIT_CONDITION
--------------------------------------------------------------------------------
CONDITION
---------
AUDIT_OPTION
--------------------------------------------------------------------------------
AUDIT_OPTION_TYPE
------------------
OBJECT_SCHEMA
--------------------------------------------------------------------------------
OBJECT_NAME
--------------------------------------------------------------------------------
OBJECT_TYPE		COM INH AUD ORA PRO
----------------------- --- --- --- --- ---
COLUMN_NAME
--------------------------------------------------------------------------------
SCHEMA_ALL_POLICY
NONE
NONE
ALL
OBJECT ACTION
ADMIN
TAB1
TABLE			NO  NO	NO  NO	NO



SQL>

表TAB1に対する全てのアクションが監査対象になっていることが確認できました。

2. スキーマ内の全ての表を監査ポリシーの監査対象に一括追加

1.の監査ポリシー作成に使用した表(TAB1)以外の表を、監査ポリシーschema_all_policyの監査対象に一括で追加します。

SQL> DECLARE
  2      sql_stmt VARCHAR2(1000);
  3      CURSOR c1 IS
  4        SELECT table_name FROM user_tables WHERE table_name != 'TAB1';
  5  BEGIN
  6      FOR item IN c1
  7      LOOP
  8          sql_stmt := 'ALTER AUDIT POLICY schema_all_policy ADD ACTIONS ALL ON admin.'||item.table_name;
  9          EXECUTE IMMEDIATE sql_stmt;
 10      END LOOP;
 11  END;
 12  /

PL/SQL procedure successfully completed.

SQL>

audit_unified_policiesビューで、作成した監査ポリシーschema_all_policyの監査対象を確認します。

SQL> SELECT * FROM audit_unified_policies
  2  WHERE policy_name = 'SCHEMA_ALL_POLICY'
  3  ORDER BY object_name;

POLICY_NAME
--------------------------------------------------------------------------------
AUDIT_CONDITION
--------------------------------------------------------------------------------
CONDITION
---------
AUDIT_OPTION
--------------------------------------------------------------------------------
AUDIT_OPTION_TYPE
------------------
OBJECT_SCHEMA
--------------------------------------------------------------------------------
OBJECT_NAME
--------------------------------------------------------------------------------
OBJECT_TYPE		COM INH AUD ORA PRO
----------------------- --- --- --- --- ---
COLUMN_NAME
--------------------------------------------------------------------------------
SCHEMA_ALL_POLICY
NONE
NONE
ALL
OBJECT ACTION
ADMIN
TAB1
TABLE			NO  NO	NO  NO	NO


SCHEMA_ALL_POLICY
NONE
NONE
ALL
OBJECT ACTION
ADMIN
TAB2
TABLE			NO  NO	NO  NO	NO


SCHEMA_ALL_POLICY
NONE
NONE
ALL
OBJECT ACTION
ADMIN
TAB3
TABLE			NO  NO	NO  NO	NO


SCHEMA_ALL_POLICY
NONE
NONE
ALL
OBJECT ACTION
ADMIN
TAB4
TABLE			NO  NO	NO  NO	NO


SCHEMA_ALL_POLICY
NONE
NONE
ALL
OBJECT ACTION
ADMIN
TAB5
TABLE			NO  NO	NO  NO	NO


SCHEMA_ALL_POLICY
NONE
NONE
ALL
OBJECT ACTION
ADMIN
TAB6
TABLE			NO  NO	NO  NO	NO


SCHEMA_ALL_POLICY
NONE
NONE
ALL
OBJECT ACTION
ADMIN
TAB7
TABLE			NO  NO	NO  NO	NO


SCHEMA_ALL_POLICY
NONE
NONE
ALL
OBJECT ACTION
ADMIN
TAB8
TABLE			NO  NO	NO  NO	NO


SCHEMA_ALL_POLICY
NONE
NONE
ALL
OBJECT ACTION
ADMIN
TAB9
TABLE			NO  NO	NO  NO	NO



9 rows selected.

SQL> 

スキーマ内の全ての表が、監査ポリシーschema_all_policyに監査対象として追加されたことが確認できました。

3. トリガーからコールされるPL/SQLプロシージャの作成

スキーマ内に表が作成された時に実行されるトリガーからコールされるPL/SQLプロシージャalter_audit_policyを作成します。

PL/SQLプロシージャalter_audit_policyは、パラメータとしてDBMS_SCHEDULERジョブで実行するPL/SQLブロックを受け取り、そのPL/SQLブロックを実行するDBMS_SCHEDULERジョブを作成/実行し、実行後にジョブを削除します。

SQL> CREATE OR REPLACE PROCEDURE alter_audit_policy(sql_stmt IN VARCHAR2)
  2  IS
  3  BEGIN
  4      DBMS_SCHEDULER.CREATE_JOB (
  5          job_name        => DBMS_SCHEDULER.GENERATE_JOB_NAME('AUD_JOB'),
  6          job_type        => 'PLSQL_BLOCK',
  7          job_action      => sql_stmt,
  8          start_date      => SYSTIMESTAMP,
  9          enabled         => TRUE,
 10          auto_drop       => TRUE
 11      );
 12  END;
 13  /

Procedure created.

SQL>

4. スキーマ内に新規表が作成された時に実行されるトリガーを作成

スキーマ内に表が作成された時に実行されるトリガーafter_create_tableを作成します。

トリガーafter_create_tableは、スキーマ内に表が作成されると、作成された表を監査ポリシーschema_all_policyの監査対象として追加するPL/SQLブロックを生成し、そのPL/SQLブロックを3.で作成したPL/SQLプロシージャalter_audit_policyに渡して実行します。

SQL> CREATE OR REPLACE TRIGGER after_create_table
  2  AFTER CREATE ON SCHEMA 
  3  BEGIN
  4      IF ORA_DICT_OBJ_TYPE = 'TABLE' THEN
  5             alter_audit_policy('BEGIN EXECUTE IMMEDIATE ''ALTER AUDIT POLICY schema_all_policy ADD ACTIONS ALL ON ' || ora_dict_obj_owner || '.' || ora_dict_obj_name || '''; END;');
  6      END IF;
  7  EXCEPTION
  8      WHEN OTHERS THEN
  9          -- Log errors here to prevent blocking user table creation
 10          NULL; 
 11  END;
 12  /

Trigger created.

SQL> 

5. 動作確認

スキーマ内に表TAB10を作成します。

SQL> CREATE TABLE tab10 (
  2      col1 NUMBER,
  3      col2 VARCHAR2(100)
  4  );

Table created.

SQL> 

audit_unified_policiesビューで、スキーマ内に作成した表TAB10が監査ポリシーschema_all_policyの監査対象に追加されているかを確認します。

SQL> SELECT * FROM audit_unified_policies
  2  WHERE policy_name = 'SCHEMA_ALL_POLICY'
  3  AND object_name = 'TAB10';

POLICY_NAME
--------------------------------------------------------------------------------
AUDIT_CONDITION
--------------------------------------------------------------------------------
CONDITION
---------
AUDIT_OPTION
--------------------------------------------------------------------------------
AUDIT_OPTION_TYPE
------------------
OBJECT_SCHEMA
--------------------------------------------------------------------------------
OBJECT_NAME
--------------------------------------------------------------------------------
OBJECT_TYPE		COM INH AUD ORA PRO
----------------------- --- --- --- --- ---
COLUMN_NAME
--------------------------------------------------------------------------------
SCHEMA_ALL_POLICY
NONE
NONE
ALL
OBJECT ACTION
ADMIN
TAB10
TABLE			NO  NO	NO  NO	NO



SQL> 

新たに作成した表TAB10が、監査ポリシーschema_all_policyの監査対象に追加されていることが確認できました。

上記の方法で、スキーマ内に追加された表を自動的に監査ポリシーの監査対象に追加できることがわかりました。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?