触发器 | Oracle Trigger 记录数据更新信息


用触发器记录一个表的修改记录。

一、创建记录表 

-- 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表进行增删改并提交后,日志表会有对应的记录。

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM