ORACLE資料庫DDL審計觸發器與隱藏引數_system_trig_enabled
最近,在我們開發庫要對一套例項做一個DDL審計觸發器,觸發器程式碼如下所示:
---- 儲存DDL語句的表
create table audit_ddl
(
opertime timestamp PRIMARY KEY,
ip varchar2(20),
hostname varchar2(30),
operation varchar2(30),
object_type varchar2(30),
object_name varchar2(30),
sql_stmt clob,
db_schema varchar2(30)
);
---- 捕獲DDL語句的觸發器
create or replace trigger trg_audit_ddl
after create or drop or truncate ON DATABASE
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
n NUMBER;
stmt clob := NULL;
sql_text ora_name_list_t;
BEGIN
n := ora_sql_txt(sql_text);
FOR i IN 1 .. n LOOP
stmt := stmt || sql_text(i);
END LOOP;
INSERT INTO audit_ddl
(opertime, ip, hostname, operation, object_type, object_name, sql_stmt,db_schema)
VALUES
(systimestamp,
sys_context('userenv', 'ip_address'),
sys_context('userenv', 'terminal'),
ora_sysevent,
ora_dict_obj_type,
ora_dict_obj_name,
stmt,
user
);
COMMIT;
END;
/
建立審計DDL的觸發器成功,並且是生效的,如圖:
但是,我用測試使用者建立表、刪除表、truncate表,都無法審計到,過程如下:
--具有或非DBA許可權使用者,執行建表
create table trg_ddl_test as select * from dba_data_files;
--然後用sys或建立ddl審計的使用者,查詢DDL審計表,無記錄返回
[oracle@oradbs ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Thu May 19 19:31:16 2016
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select * from audit_ddl;
no rows selected
SQL>
但是,相同的觸發器在相同伺服器,相同版本的其他資料庫例項上執行,都能捕獲到DDL,如圖所示:
後來,對DDL審計觸發器做了修改,就是建立測試表,觸發觸發器,讓觸發器向DDL審計觸發器插入一個1,沒有成功;由此,懷疑,DDL審計觸發器不起作用的資料庫例項引數配置肯定有問題,透過對比發現:隱藏引數_system_trig_enabled在DDL審計觸發器不起作用的伺服器上被設定為了false:
SQL> show parameter _system_trig_enabled
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_system_trig_enabled boolean FALSE
該引數是動態引數,執行alter system set "_system_trig_enabled"=true; 將引數設定為true
SQL> alter system set "_system_trig_enabled"=true;
System altered.
SQL> show parameter _system_trig_enabled
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_system_trig_enabled boolean TRUE
設定完隱藏引數為true後,資料庫例項可以正常審計資料庫級別的DDL:
--test使用者truncate表,drop表
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
CDBA_DATA_FILES TABLE
TRG_DDL_TEST TABLE
SQL> truncate table TRG_DDL_TEST;
Table truncated.
SQL> drop table TRG_DDL_TEST;
Table dropped.
--DDL審計使用者查詢審計記錄:
需要注意的這裡只審計了create、drop和truncate,如果需要審計所有DDL,只需要修改:after create or drop or truncate on database為after ddl on database即可。
---- 儲存DDL語句的表
create table audit_ddl
(
opertime timestamp PRIMARY KEY,
ip varchar2(20),
hostname varchar2(30),
operation varchar2(30),
object_type varchar2(30),
object_name varchar2(30),
sql_stmt clob,
db_schema varchar2(30)
);
---- 捕獲DDL語句的觸發器
create or replace trigger trg_audit_ddl
after create or drop or truncate ON DATABASE
DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
n NUMBER;
stmt clob := NULL;
sql_text ora_name_list_t;
BEGIN
n := ora_sql_txt(sql_text);
FOR i IN 1 .. n LOOP
stmt := stmt || sql_text(i);
END LOOP;
INSERT INTO audit_ddl
(opertime, ip, hostname, operation, object_type, object_name, sql_stmt,db_schema)
VALUES
(systimestamp,
sys_context('userenv', 'ip_address'),
sys_context('userenv', 'terminal'),
ora_sysevent,
ora_dict_obj_type,
ora_dict_obj_name,
stmt,
user
);
COMMIT;
END;
/
建立審計DDL的觸發器成功,並且是生效的,如圖:
但是,我用測試使用者建立表、刪除表、truncate表,都無法審計到,過程如下:
--具有或非DBA許可權使用者,執行建表
create table trg_ddl_test as select * from dba_data_files;
--然後用sys或建立ddl審計的使用者,查詢DDL審計表,無記錄返回
[oracle@oradbs ~]$ sqlplus / as sysdba
SQL*Plus: Release 11.2.0.3.0 Production on Thu May 19 19:31:16 2016
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> select * from audit_ddl;
no rows selected
SQL>
但是,相同的觸發器在相同伺服器,相同版本的其他資料庫例項上執行,都能捕獲到DDL,如圖所示:
後來,對DDL審計觸發器做了修改,就是建立測試表,觸發觸發器,讓觸發器向DDL審計觸發器插入一個1,沒有成功;由此,懷疑,DDL審計觸發器不起作用的資料庫例項引數配置肯定有問題,透過對比發現:隱藏引數_system_trig_enabled在DDL審計觸發器不起作用的伺服器上被設定為了false:
SQL> show parameter _system_trig_enabled
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_system_trig_enabled boolean FALSE
該引數是動態引數,執行alter system set "_system_trig_enabled"=true; 將引數設定為true
SQL> alter system set "_system_trig_enabled"=true;
System altered.
SQL> show parameter _system_trig_enabled
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
_system_trig_enabled boolean TRUE
設定完隱藏引數為true後,資料庫例項可以正常審計資料庫級別的DDL:
--test使用者truncate表,drop表
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
CDBA_DATA_FILES TABLE
TRG_DDL_TEST TABLE
SQL> truncate table TRG_DDL_TEST;
Table truncated.
SQL> drop table TRG_DDL_TEST;
Table dropped.
--DDL審計使用者查詢審計記錄:
需要注意的這裡只審計了create、drop和truncate,如果需要審計所有DDL,只需要修改:after create or drop or truncate on database為after ddl on database即可。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29357786/viewspace-2117217/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle資料庫DDL審計觸發器觸發的bug問題Oracle資料庫觸發器
- 資料庫觸發器,禁止DDL操作資料庫觸發器
- 審計資料庫登陸登出觸發器資料庫觸發器
- Oracle引數-隱藏引數Oracle
- 資料庫DDL操作審計資料庫
- 審計資料庫登陸失敗觸發器資料庫觸發器
- ORACLE DDL觸發器Oracle觸發器
- oracle ddl 觸發器Oracle觸發器
- oracle trigger觸發器審計schema物件的變更ddlOracle觸發器物件
- 獲取資料庫中所有隱藏引數資料庫
- Oracle 隱藏引數使用Oracle
- 檢視oracle隱藏引數Oracle
- Oracle使用系統級觸發器審計重要帳號的DDL語句Oracle觸發器
- 檢視資料庫中的隱藏引數(指令碼)資料庫指令碼
- Oracle 觸發器 限制DDL操作Oracle觸發器
- Oracle 各版本引數/隱藏引數 介紹Oracle
- 檢視Oracle隱藏引數的SQLOracleSQL
- oracle隱藏引數的檢視和使用Oracle
- Oracle中審計刪除(DELETE)操作的觸發器Oracledelete觸發器
- DML操作 DDL觸發器觸發器
- ORACLE 資料庫審計詳解Oracle資料庫
- ORACLE資料庫標準審計Oracle資料庫
- 審計Oracle資料庫的使用Oracle資料庫
- 隱藏引數查詢sqlSQL
- 觸發器限制指定IP訪問oracle資料庫觸發器Oracle資料庫
- oracle巧用觸發器提高資料庫安全級別Oracle觸發器資料庫
- SQL Server 2005中使用DDL觸發器監控資料庫變化SQLServer觸發器資料庫
- Oracle資料庫審計功能介紹Oracle資料庫
- 資料庫審計方案(包括login,logout,DML,DDL等)資料庫Go
- 資料庫開發---常用物件-觸發器資料庫物件觸發器
- Oracle 資料庫引數調整Oracle資料庫
- ORACLE SQL調優之執行計劃與隱藏引數_complex_view_mergingOracleSQLView
- Oracle11g版本中未歸檔隱藏引數Oracle
- Oracle12c版本中未歸檔隱藏引數Oracle
- SQL資料庫觸發器例項SQL資料庫觸發器
- 資料庫的觸發器的使用資料庫觸發器
- 資料庫檢視,索引,觸發器資料庫索引觸發器
- 【審計】標準資料庫審計資料庫