從Oracle9i開始,就可以使用DBMS_FGA可以對指定的表的select語句進行審計
但是在9i中只能對select語句進行審計,在10g中可以實現對DML的審計功能
下面用DBMS_FGA來展示select語句的審計功能
① 假定我們存在表t,包含記錄為
sys@ORCL> select * from hr.t; ID NAME---------- -------------------- 1 a 2 b 3 c 4 d 5 e
② 分析該表,讓其使用CBO最佳化模式
sys@ORCL> analyze table hr.t compute statistics;Table analyzed.
③ 檢查以前的審計策略與審計日誌
sys@ORCL> select OBJECT_SCHEMA,OBJECT_NAME,POLICY_NAME from dba_audit_policies;no rows selectedsys@ORCL> select OBJECT_SCHEMA,OBJECT_NAME,POLICY_NAME,SQL_TEXT from dba_fga_audit_trail;no rows selected
dba_audit_policies:用來存放審計策略
dba_fga_audit_trail:用來存放審計日誌,即執行了那些SQL語句
通過以上的查詢,我們也可以看到,以前沒有審計策略,也沒有審計日誌
④ 現在,我們在hr.t表增加一個審計策略
sys@ORCL> begin 2 dbms_fga.add_policy(object_schema=>'HR', 3 object_name=>'T', 4 policy_name=>'chk_t', 5 audit_condition=>'id=2', 6 audit_column=>'NAME', 7 enable=>TRUE, 8 statement_types=>'SELECT,INSERT,UPDATE,DELETE' 9 ); 10 end; 11 /PL/SQL procedure successfully completed.
⑤ 我們再查詢dba_audit_policies,就可以發現這條審計策略了
sys@ORCL> select OBJECT_SCHEMA,OBJECT_NAME,POLICY_NAME,ENABLED from dba_audit_policies;OBJECT_SCHEMA OBJECT_NAME POLICY_NAME ENA------------------------------ ------------------------------ ------------------------------ ---HR T CHK_T YES
⑥ 那麼就讓我們看看該審計策略怎麼生效,假定我們執行如下的一些語句
u1@ORCL> select count(*) from hr.t where id=1; COUNT(*)---------- 1 可以看到,該查詢返回的結果集中顯然沒有id=2的行,所以,該查詢不能被審計u1@ORCL> select count(*) from hr.t where id=2; COUNT(*)---------- 1 有人說這個語句包含了id=2,該被審計了吧,然,我們的審計條件中還有一個是審計列必須要有name count(*)沒有包含name,所以該語句還是沒有被審計u1@ORCL> select count(*) from hr.t where name='b'; COUNT(*)---------- 1 這個語句被審計了,因為已經包含了列name在where中,而name=b正好是id=2的行,所以id=2是被隱式包含的u1@ORCL> select * from hr.t where id=2; ID NAME---------- -------------------- 2 b 該語句肯定被審計,所有列肯定包含審計列name,謂語條件正好是id=2u1@ORCL> select id from hr.t where id=3; ID---------- 3 這個語句肯定就不被審計了,典型的什麼都不滿足u1@ORCL> select name from hr.t where name='b';NAME--------------------b 這個語句也被審計,為什麼呢?這個語句包含審計列,而且隱式包含了id=2(因為id=2與name=b是同一行)u1@ORCL> select name from hr.t where name='d';NAME--------------------d 這個語句沒有被審計,因為雖然滿足了審計列的條件,但是沒有顯式或隱式包含id=2 但是如果在您的環境中,這個語句如果被審計了,就請您確信是否分析過表,該查詢是否是使用的CBO最佳化計劃
綜合以上結果,以上被審計的語句應當是3個:
sys@ORCL> select OBJECT_SCHEMA,OBJECT_NAME,POLICY_NAME,SQL_TEXT from dba_fga_audit_trail;OBJEC OBJEC POLIC SQL_TEXT----- ----- ----- ---------------------------------------------HR T CHK_T select count(*) from hr.t where name='b'HR T CHK_T select * from hr.t where id=2HR T CHK_T select name from hr.t where name='b'
對于越來越多的審計記錄,我們必須手工維護,刪除沒有參考價值的記錄,我們可以運行如下查詢來刪除審計記錄(需要delete any table的許可權或在sys下執行):
delete from sys.fga_log$ or delete from Dba_Fga_Audit_Trail
到這裡,大家總該明白了怎麼樣審計表的Select語句,同普通審計與DML觸發器一樣,對過多的表進行審計,將會嚴重影響效能。
但是,在特定的情況下,如果想跟蹤一個表的Select語句已便於最佳化,也還是可以的
⑦ 相關注意事項
沒有提交也被審計
sys不被審計,我第一次實驗時用sys便錯了