【FGA】擴充套件Oracle細粒度審計功能——呼叫定製的儲存過程

secooler發表於2010-09-06
Oracle的細粒度審計(FGA)可以呼叫定製的儲存過程,這樣可以非常方便地協助我們完成更多的任務,就該方法做一個簡單展示。供參考。

1.建立待審計的表T及儲存過程操作的監控表MON_T

1)建立表T並初始化兩條記錄
sec@ora10g> create table t (x int);

Table created.

sec@ora10g> insert into t values (1);

1 row created.

sec@ora10g> insert into t values (101);

1 row created.

sec@ora10g> commit;

Commit complete.

sec@ora10g> select * from t;

         X
----------
         1
       101

2)建立儲存過程操作的監控表MON_T
sec@ora10g> create table mon_t (x date);

Table created.

2.建立待FGA呼叫的儲存過程
CREATE OR REPLACE PROCEDURE proc_mon_t (schema_name    VARCHAR2,
                                        table_name     VARCHAR2,
                                        policy         VARCHAR2)
IS
BEGIN
   INSERT INTO mon_t
     VALUES   (SYSDATE);
END;
/

我們的目標是:當滿足審計條件之後會向表mon_t中中插入一條時間記錄,表明發生審計動作的時間。
注意上述儲存過程的引數名。

3.定製FGA審計策略
BEGIN
   DBMS_FGA.ADD_POLICY (
            object_schema       => 'SEC',
            object_name         => 'T',
            policy_name         => 'audit_test',
            audit_condition     => 'X < 100',
            audit_column        => 'X',
            HANDLER_SCHEMA      => 'SEC',
            HANDLER_MODULE      => 'PROC_MON_T',
            enable              => TRUE,
            statement_types     => 'DELETE',
            audit_trail         => DBMS_FGA.XML + DBMS_FGA.EXTENDED,
            audit_column_opts   => DBMS_FGA.ANY_COLUMNS);
END;
/

該策略對T表滿足X<100條件的刪除動作進行審計。
這裡重點關注的引數是HANDLER_MODULE,使用該引數可以實現呼叫儲存過程的目的。

BTW:刪除該FGA審計策略的方法如下。
exec DBMS_FGA.DROP_POLICY ( object_schema => 'SEC', object_name => 'T', policy_name => 'audit_test');

4.測試審計效果
1)刪除滿足x < 100條件的記錄的測試
sec@ora10g> delete from t where x = 1;

1 row deleted.

sec@ora10g> select sql_text from V$XML_AUDIT_TRAIL;

SQL_TEXT
---------------------------------------------------------------------
delete from t where x = 1

此時已經可以檢視到具體的審計資訊,與此同時儲存過程PROC_MON_T已被觸發,對應的MON_T表中已經可以檢視到觸發的時間。
sec@ora10g> select * from mon_t;

X
-------------------
2010-09-06 21:40:33

2)刪除未滿足x < 100條件的記錄的測試
sec@ora10g> delete from t where x = 101;

1 row deleted.

sec@ora10g> select sql_text from V$XML_AUDIT_TRAIL;

SQL_TEXT
--------------------------------------------------------------------
delete from t where x = 1

sec@ora10g> select * from mon_t;

X
-------------------
2010-09-06 21:40:33

可見,在不滿足審計條件的時候,不記錄任何審計資訊,因此儲存過程亦不被觸發。

5.小結
FGA細粒度審計呼叫儲存過程的方法會給我們帶來很多的便利,給我們的想象力留有空間。我們可以使用這個技術擴充套件FGA的功能。

Good luck.

secooler
10.09.06

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-672903/,如需轉載,請註明出處,否則將追究法律責任。

相關文章