使用觸發器配置oracle用戶登錄信息日誌功能

(1)創建結果日誌表

create table LOG$INFO
(
  USERNAME VARCHAR2(30),  --登陸用戶名
  TERMINAL VARCHAR2(50),  --登錄終端名
  IPADRESS VARCHAR2(20),  --登錄IP地址
  OSUSER VARCHAR2(30),    --登錄主機用戶名
  MACHINE VARCHAR2(64),   --登錄主機名
  PROGRAM VARCHAR2(64),   --登錄方式:plsql
  SID NUMBER,             
  SERIAL# NUMBER,
  AUSID NUMBER,
  LOGINTIME DATE default sysdate, --登入時間
  LOGout_TIME date                --登出時間
);
(2)創建登錄觸發器

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 log$info(username,logintime,terminal,ipadress,osuser,machine,
program,sid,serial#,ausid)
       VALUES(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;
/
(3)創建登出觸發器

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 LOG$INFO SET LOGOUT_TIME=SYSDATE WHERE sid=mtSession.Sid AND serial#=mtSession.Serial#;
  END IF;
  CLOSE cSession;
EXCEPTION
  WHEN OTHERS THEN
    raise;
END;
/
(4)查詢登錄信息

select *from LOG$INFO;
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章