记录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 TRIGGERlocks_aduitdelbefore delete on wbxcore_locksfor each rowbegin 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_pathFROM DUAL; 这样我们就很容易从表aduitclock中,根据ip_address 和LOCK_PATH查出是哪个server删除了这条数据了。
页:
[1]