如果要審計資料庫中的DDL操作,那麼可以通過DDL觸發器來實現,本節介紹一個例子,把資料庫中的所有DDL操作都記錄下來。本例子可以在Oracle 8i或更高的版本中使用。
第一步,建立資料表空間和相關的日誌表:
create tablespace statlog datafile '/oradata/statlog.dbf' size 200m;
create table stat$log_ddl
(
ddl_date date,
user_name varchar2(30),
ip_addr VARCHAR2(30),
obj_name VARCHAR2(50),
ddl_type VARCHAR2(30),
object_type VARCHAR2(18),
owner VARCHAR2(30),
SQL_TEXT VARCHAR2(1000)
) TABLESPACE STATLOG;
第二步,建立資料庫級的DDL觸發器,把所有的DDL操作都記錄下來
CREATE OR REPLACE TRIGGER DDL_audit AFTER CREATE OR ALTER OR DROP OR TRUNCATE OR
GRANT OR REVOKE OR RENAME
on DATABASE
declare
ipaddr varchar2(20);
STEXT VARCHAR2(1000);
BEGIN
begin
select sys_context('USERENV', 'IP_ADDRESS') into ipaddr FROM dual;
exception when others then
ipaddr:='-';
end;
begin
select SQL_TEXT INTO STEXT FROM v$open_cursor WHERE UPPER(sql_text) LIKE 'ALTER%';
exception when others then
STEXT:='-';
end;
insert into sys.stat$log_DDL values
(sysdate,
user,
nvl (ipaddr,'-'),
NVL(ora_dict_obj_name,'-'),
NVL(ORA_SYSEVENT,'-'),
NVL(ora_dict_obj_type,'-'),
NVL(ora_dict_obj_owner,'-'),
STEXT
);
exception when others then
null;
end;
/