Oracle 中記錄用戶登陸信息

咱們能夠使用 Oracle Audit 函數來記錄用戶登陸信息,可是若是開放了 Audit 函數將會使 Oracle 性能降低,甚至致使 Oracle 崩潰。那咱們如何才能記錄用戶登陸信息呢?其實咱們能夠經過創建觸發器的方式來實現。方法以下:session

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函數

相關文章
相關標籤/搜索