Oracle 中記錄用戶登錄信息


我們可以使用 Oracle Audit 函數來記錄用戶登錄信息,但是如果開放了 Audit 函數將會使 Oracle 性能下降,甚至導致 Oracle 崩潰。那我們如何才能記錄用戶登錄信息呢?其實我們可以通過建立觸發器的方式來實現。方法如下:

1. 用 sys 用戶登錄 Oracle
2. 創建記錄用戶登錄信息的表
CREATE TABLE LOG$INFORMATION
(
   ID        NUMBER(10),
   USERNAME  VARCHAR2(30),
   LOGINTIME DATE,
   TERMINAL  VARCHAR2(50),
   IPADRESS  VARCHAR2(20),
   OSUSER    VARCHAR2(30),
   MACHINE   VARCHAR2(64),
   PROGRAM   VARCHAR2(64),
   SID       NUMBER,
   SERIAL#   NUMBER,
   AUSID     NUMBER
)
/
 
3. 創建一個 Sequence,作為登錄信息的主鍵
CREATE SEQUENCE LOGIN_SEQ
minvalue 1
maxvalue 9999999999
start with 1
increment by 1
cache 20
/
 
4. 創建觸發器,記錄用戶登錄信息
CREATE OR REPLACE TRIGGER LOGIN_RECORD_TR
AFTER logon ON DATABASE
DECLARE
  mtSession v$session%ROWTYPE;
  CURSOR cSession(iiQuerySid IN NUMBER) IS
    SELECT * FROM v$session
       WHERE audsid = iiQuerySid;
BEGIN
OPEN cSession(userenv('SESSIONID'));
   FETCH cSession INTO mtSession;
      IF cSession%FOUND AND SYS_CONTEXT ('USERENV','IP_ADDRESS') IS NOT NULL THEN
         INSERT INTO log$information(
            id,
            username,
            logintime,
            terminal,
            ipadress,
            osuser,
            machine,
            program,
            sid,
            serial#,
            ausid
         ) VALUES(
            login_seq.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;
/
 
5. 將 SYS.LOG$INFORMATION 授權給需要查看登錄記錄的用戶
Grant select on SYS.LOG$INFORMATION to XXX


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM