用触发器记录一个表的修改记录。
一、创建记录表
-- Create table create table T_SYS_STAFF_TRIGGER_LOG ( operationtime DATE, staff_id NUMBER(8), staff_name VARCHAR2(60), login_id VARCHAR2(30), operationtype VARCHAR2(30), operationdetail VARCHAR2(1000), sessionid VARCHAR2(10), clientgroupinfo VARCHAR2(30), clientuser VARCHAR2(30), clienipaddress VARCHAR2(30) )
二、创建触发器
CREATE OR REPLACE TRIGGER TRIGGER_T_SYS_STAFF AFTER DELETE OR INSERT OR UPDATE ON T_SYS_STAFF FOR EACH ROW /* add on 20180928 add by wzh function :record modify t_sys_staff */ DECLARE STAFF_ID T_SYS_STAFF_TRIGGER_LOG.STAFF_ID%TYPE; STAFF_NAME T_SYS_STAFF_TRIGGER_LOG.STAFF_NAME%TYPE; LOGIN_ID T_SYS_STAFF_TRIGGER_LOG.LOGIN_ID%TYPE; OPERATIONTYPE T_SYS_STAFF_TRIGGER_LOG.OPERATIONTYPE%TYPE; OPERATIONDETAIL T_SYS_STAFF_TRIGGER_LOG.OPERATIONDETAIL%TYPE; OPERATIONTIME T_SYS_STAFF_TRIGGER_LOG.OPERATIONTIME%TYPE := sysdate; SESSIONID T_SYS_STAFF_TRIGGER_LOG.Sessionid%type; CLIENTGROUPINFO T_SYS_STAFF_TRIGGER_LOG.Clientgroupinfo%type; CLIENTUSER T_SYS_STAFF_TRIGGER_LOG.Clientuser%type; CLIENIPADDRESS T_SYS_STAFF_TRIGGER_LOG.Clienipaddress%type; BEGIN select SYS_CONTEXT('USERENV', 'SESSIONID') SESSIONID, sys_context('USERENV', 'HOST') clientgroupinfo, sys_context('USERENV', 'OS_USER') clientuser, sys_context('USERENV', 'IP_ADDRESS') clienipaddress into SESSIONID, clientgroupinfo, clientuser, CLIENIPADDRESS from dual; IF INSERTING THEN --INSERT触发 OPERATIONTYPE := 'INSERT'; STAFF_ID := :new.staff_id; STAFF_NAME := :new.staff_name; LOGIN_ID := :new.login_id; ELSIF UPDATING THEN --UPDATE触发 OPERATIONTYPE := 'UPDATE'; STAFF_ID := :new.staff_id; STAFF_NAME := :new.staff_name; LOGIN_ID := :new.login_id; --mobile if (:old.mobile is null and :new.mobile is not null) then OPERATIONDETAIL := OPERATIONDETAIL || ',电话由【空】修改为【' || :new.mobile || '】'; end if; if (:old.mobile is not null and :new.mobile is null) then OPERATIONDETAIL := OPERATIONDETAIL || ',电话由【' || :old.mobile || '】修改为【空】'; end if; if :old.mobile <> :new.mobile then OPERATIONDETAIL := OPERATIONDETAIL || ',电话由【' || :old.mobile || '】修改为【' || :new.mobile || '】'; end if; --login_pwd if :old.login_pwd <> :new.login_pwd then OPERATIONDETAIL := OPERATIONDETAIL || ',密码由【' || :old.login_pwd || '】修改为【' || :new.login_pwd || '】'; end if; --else if OPERATIONDETAIL is null then OPERATIONDETAIL := '对密码和电话外字段修改'; end if; ELSIF DELETING THEN --DELETE触发 OPERATIONTYPE := 'DELETE'; STAFF_ID := :old.staff_id; STAFF_NAME := :old.staff_name; LOGIN_ID := :old.login_id; END IF; INSERT INTO T_SYS_STAFF_TRIGGER_LOG VALUES (OPERATIONTIME, staff_id, staff_name, login_id, OPERATIONTYPE, OPERATIONDETAIL, SESSIONID, CLIENTGROUPINFO, CLIENTUSER, CLIENIPADDRESS); COMMIT; EXCEPTION WHEN OTHERS THEN NULL; END TRIGGER_T_SYS_STAFF;
创建成功,查询数据库用户中触发器信息就能看到创建的触发器记录:
select * from user_triggers;
oracle如果是管理员,可以对会话表进行显式授权,但是非管理员用户怎么获取客户端信息?
这个问题已经解决,上面触发器脚本中是解决后的脚本。
SELECT USERNAME, SID, PROGRAM, MACHINE, SYS_CONTEXT('USERENV', 'IP_ADDRESS'), SYSDATE FROM V$SESSION WHERE AUDSID = USERENV('SESSIONID');
四、测试
对t_sys_staff表进行增删改并提交后,日志表会有对应的记录。