用觸發器記錄一個表的修改記錄。
一、創建記錄表
-- 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表進行增刪改並提交后,日志表會有對應的記錄。