Oracle实用技巧-触发器跟踪示例

来源:这里教程网 时间:2026-03-03 20:43:01 作者:
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;

相关推荐