觸發器 | 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