记录DB数据是被哪台数据删除的触发器

前几天遇到了一个奇怪的bug,有一条数据莫名其妙被删除了。而这条数据也不是每次都被删除,只是偶尔被删除。删除这条数据的函数在两个地方调用:1. 在主线程中,用户请求,将被删除。2. 在一个守护线程中,每隔一定的时间运行删除。由于是多台server同时运行,前面有台Load balance进行负载均衡。这样我们没有办法确定是哪台server删除了这条数据,而且也有可能是开发者直接用本地的环境连到db删除了这条数据。为了确认是哪台server删除这条数据,于是我们增加了一个触发器对这个表进行了监控:

1. 创建一个记录请求的表

create table aduitclock(
terminal varchar2(250),
sessionid varchar2(250),
instance varchar2(250),
current_user varchar2(250),
current_userid varchar2(250),
session_user varchar2(250),
session_userid varchar2(250),
proxy_user varchar2(250),
proxy_userid varchar2(250),
db_domain varchar2(250),
db_name varchar2(250),
host varchar2(250),
os_user varchar2(250),
external_name varchar2(250),
ip_address varchar2(250),
INSERTTIME varchar2(250),
LOCK_PATH varchar2(4000)
)
 

2. 增加触发器对表进行监控

CREATE OR REPLACE TRIGGER  locks_aduitdel
before delete on wbxcore_locks
for each row
begin 
insert into aduitclock select
          SYS_CONTEXT('USERENV','TERMINAL') terminal,
          SYS_CONTEXT('USERENV','SESSIONID') sessionid,
          SYS_CONTEXT('USERENV','INSTANCE') instance,
          SYS_CONTEXT('USERENV','CURRENT_USER') current_user,
          SYS_CONTEXT('USERENV','CURRENT_USERID') current_userid,
          SYS_CONTEXT('USERENV','SESSION_USER') session_user,
          SYS_CONTEXT('USERENV','SESSION_USERID') session_userid,
          SYS_CONTEXT('USERENV','PROXY_USER') proxy_user,
          SYS_CONTEXT('USERENV','PROXY_USERID') proxy_userid,
          SYS_CONTEXT('USERENV','DB_DOMAIN') db_domain,
          SYS_CONTEXT('USERENV','DB_NAME') db_name,
          SYS_CONTEXT('USERENV','HOST') host,
          SYS_CONTEXT('USERENV','OS_USER') os_user,
          SYS_CONTEXT('USERENV','EXTERNAL_NAME') external_name,
          SYS_CONTEXT('USERENV','IP_ADDRESS') ip_address,
          sysdate,
          :old.lock_path
FROM DUAL;
 这样我们就很容易从表 aduitclock中,根据ip_address 和LOCK_PATH查出是哪个server删除了这条数据了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值