1.DDL拒绝触发器
--Database
--DBA on
create or replace trigger trig_prevent_drop before drop on database
begin
raise_application_error(-20002,'不能删除表,需要请与DBA联系');
end;
2.DDL跟踪触发器
-- drop table trace_source_header_hist
-- drop table trace_source_detail_hist;
-- drop sequence seq_source_header_id;
conn / as sysdba;
create table dbmonitor.trace_source_header_hist
(modify_time date default sysdate,
username varchar2(50),
modify_id number);
create table dbmonitor.trace_source_detail_hist
(
modify_id number,
owner varchar2(50),
name varchar2(50),
type varchar2(40),
line number,
text varchar2(2000),
ip_addr varchar2(100));
create sequence dbmonitor.seq_source_header_id start with 1 increment by 1 ;
create or replace trigger trig_source_ddl before create on database
begin
if ora_dict_obj_type in('PACKAGE','PACKAGE BODY','PROCEDURE','FUNCTION','JAVA SOURCE')
then
insert into dbmonitor.trace_source_header_hist(username,modify_id) values(ora_dict_obj_owner,dbmonitor.seq_source_header_id.nextval);
insert into dbmonitor.trace_source_detail_hist select dbmonitor.seq_source_header_id.currval,s.*,ora_client_ip_address from dba_source s
where s.owner=ora_dict_obj_owner
and s.name=ora_dict_obj_name
and s.type=ora_dict_obj_type;
end if;
end;
3.数据库错误跟踪触发器
create table dbmonitor.trace_server_errors
(error_date date default sysdate,
username varchar2(40),
error_mesg varchar2(4000),
error_sql varchar2(4000));
create or replace trigger trig_server_error_log after servererror on database
declare
sql_text ora_name_list_t;
msg varchar2(2000):=null;
stmt varchar2(2000):=null;
begin
for i in 1..ora_server_error_depth loop
msg:=msg ||ora_server_error_msg(i);
end loop;
for i in 1..ora_sql_txt(sql_text) loop
stmt:=stmt || sql_text(i);
end loop;
insert into dbmonitor.trace_server_errors(username,error_mesg,error_sql) values(ora_login_user,msg,stmt);
end;