1. 程式人生 > >oracle通過觸發器實現登錄登出日誌記錄

oracle通過觸發器實現登錄登出日誌記錄

not contex lose 自動 begin val then sys tab

-----刪除表--- drop table userlogininfo --創建登錄登出記錄信息表 create table userlogininfo ( infoid int primary key not null, USERNAME VARCHAR2(30), TERMINAL VARCHAR2(50), IPADRESS VARCHAR2(20), OSUSER VARCHAR2(30), MACHINE VARCHAR2(64), PROGRAM VARCHAR2(64), SID NUMBER, SERIAL# NUMBER, AUSID NUMBER, LOGINTIME DATE default sysdate, LOGout_TIME date ) ---刪除序列--- DROP SEQUENCE seq_userlogininfo ---創建自動增長序列-- CREATE SEQUENCE seq_userlogininfo INCREMENT BY 1 -- 每次加幾個 START WITH 1 -- 從1開始計數 NOMAXVALUE -- 不設置最大值 NOCYCLE -- 一直累加,不循環 CACHE 10; ------- -----刪除觸發器---- DROP TRIGGER TR_LOGIN_RECORD ------創建登錄觸發器--- CREATE OR REPLACE TRIGGER TR_LOGIN_RECORD AFTER logon ON DATABASE DECLARE mtSession v$session%ROWTYPE; CURSOR cSession(iiQuerySid IN NUMBER) IS SELECT * FROM v$session WHERE nvl(osuser,‘x‘) <> ‘SYSTEM‘ and type <> ‘BACKGROUND‘ and audsid = iiQuerySid; BEGIN OPEN cSession(userenv(‘SESSIONID‘)); FETCH cSession INTO mtSession; IF cSession%FOUND THEN INSERT INTO userlogininfo(infoid,username,logintime,terminal,ipadress,osuser,machine, program,sid,serial#,ausid) VALUES(seq_userlogininfo.nextval,USER,SYSDATE,mtSession.Terminal, SYS_CONTEXT (‘USERENV‘,‘IP_ADDRESS‘),mtSession.Osuser, mtSession.Machine,mtSession.Program,mtSession.Sid,mtSession.Serial#,userenv(‘SESSIONID‘)); END IF; CLOSE cSession; EXCEPTION WHEN OTHERS THEN raise; end; -----創建登出更新登出時間觸發器--- create or replace trigger TR_LOGOFF_RECORD before LOGOFF ON DATABASE DECLARE mtSession v$session%ROWTYPE; CURSOR cSession(iiQuerySid IN NUMBER) IS SELECT * FROM v$session where nvl(osuser,‘x‘) <> ‘SYSTEM‘ and type <> ‘BACKGROUND‘ and audsid = iiQuerySid; BEGIN OPEN cSession(userenv(‘SESSIONID‘)); FETCH cSession INTO mtSession; IF cSession%FOUND THEN UPDATE userlogininfo SET LOGOUT_TIME=SYSDATE WHERE sid=mtSession.Sid AND serial#=mtSession.Serial#; END IF; CLOSE cSession; EXCEPTION WHEN OTHERS THEN raise; END;

oracle通過觸發器實現登錄登出日誌記錄