heipark 发表于 2013-1-28 18:23:37

谁动了我的数据——让Oracle触发器查找“元凶”

故事是这样的……
在上周修复一个分目录统计的BUG,测试后OK本周一上线的,可是上线后数据一会儿正确一会儿错误,认真分析后发现新程序把数据入库后,一会又被“坏人”写入错误数据。
就这样一场找“坏人”的斗争就这样开始……
 
1.  创建跟踪记录日志表
create table RESULT
(
  IP     VARCHAR2(256),
  MYDATE DATE,
  TYPE   VARCHAR2(20)
)
tablespace USERS
  pctfree 10
  initrans 1
  maxtrans 255
  storage
  (
    initial 64K
    minextents 1
    maxextents unlimited
  );  
 
2.  创建insert跟踪触发器
create or replace trigger tri_insert
  after insert on country 
  for each row
begin
  DECLARE
    v_user_identifier VARCHAR2(64);
  BEGIN
    SELECT SYS_CONTEXT('USERENV', 'OS_USER') || ':' ||
           SYS_CONTEXT('USERENV', 'IP_ADDRESS')
      INTO v_user_identifier
      FROM DUAL;
 
    insert into result (ip, mydate,type) values (v_user_identifier, sysdate,'INSERT');
  END;
end TRI_INSERT;
 
3.  创建Delete跟踪触发器
create or replace trigger TRI_DELETE
  after delete on country 
  for each row
begin
  DECLARE
    v_user_identifier VARCHAR2(64);
  BEGIN
    SELECT SYS_CONTEXT('USERENV', 'OS_USER') || ':' ||
           SYS_CONTEXT('USERENV', 'IP_ADDRESS')
      INTO v_user_identifier
      FROM DUAL;
 
    insert into result (ip, mydate,type) values (v_user_identifier, sysdate,'DEL');
  END;
end TRI_DELETE;
 
4.  创建update跟踪触发器(省略)
 
5.  抓“坏人”
当Insert 、delete、update数据时,将会写操作记录,如下表所示:

1 heipark:192.168.1.61 2010/12/15 16:32:53 INSERT
2 heipark:192.168.1.61 2010/12/15 16:33:00 DEL
 
 
至此,“坏人”落网。阿弥陀佛~~

参考文章:http://cyr1974.itpub.net/post/2066/278990
页: [1]
查看完整版本: 谁动了我的数据——让Oracle触发器查找“元凶”