Oracle 8i 引入資料庫啟動、DDL、使用者登入/登出觸發器。本文示範利用登入/登出觸發器建立使用者活動審計機制。
採單一表記錄登入與登出資訊,避免兩表關聯困難。預先計算工作階段持續時間,利於報表分析。
登入時取得: USER、SESSIONID(SYS_CONTEXT)、HOST、LOGON_TIME(精確到毫秒)。
登出時取得: LAST_PROGRAM、LAST_ACTION、LAST_MODULE、LOGOFF_TIME、SESSION_DURATION。
CREATE OR REPLACE TRIGGER audit_logon_trg
AFTER LOGON ON DATABASE
BEGIN
INSERT INTO user_audit_trail (
username, session_id, host, logon_date, logon_time
) VALUES (
SYS_CONTEXT('USERENV','SESSION_USER'),
SYS_CONTEXT('USERENV','SESSIONID'),
SYS_CONTEXT('USERENV','HOST'),
TRUNC(SYSDATE),
TO_CHAR(SYSDATE, 'HH24:MI:SS.FF3')
);
END;
CREATE OR REPLACE TRIGGER audit_logoff_trg
BEFORE LOGOFF ON DATABASE
DECLARE
v_sid NUMBER := SYS_CONTEXT('USERENV','SESSIONID');
BEGIN
UPDATE user_audit_trail
SET last_program = SYS_CONTEXT('USERENV','PROGRAM'),
last_action = SYS_CONTEXT('USERENV','ACTION'),
last_module = SYS_CONTEXT('USERENV','MODULE'),
logoff_time = TO_CHAR(SYSDATE, 'HH24:MI:SS.FF3'),
session_minutes = ROUND((SYSDATE - logon_date - logon_time) * 24 * 60, 2)
WHERE session_id = v_sid
AND logoff_time IS NULL;
END;
系統觸發器功能尚在增強中(10g 將大幅改進)。目前無法捕捉會話期間具體 SQL 操作,需搭配細粒度審計或自訂觸發器。