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

-----刪除表---
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;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章