標籤:os 使用 io for ar art log sp on
我們可以使用 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
Oracle 中記錄使用者登入資訊