首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 觸發器審計使用者活動:登入/登出追蹤實作(第一部分)

     編輯:Oracle 資料庫基礎

系統級觸發器簡介

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;

報表應用

  • 總工作階段時間統計: 依日期、使用者彙總使用時長。
  • 即時並發使用者趨勢: 任一時點登入中會話數,可匯出 Excel 繪製每小時活動曲線,發現尖峰時段(如週三下午 1 點),調整資源配置。

限制與展望

系統觸發器功能尚在增強中(10g 將大幅改進)。目前無法捕捉會話期間具體 SQL 操作,需搭配細粒度審計或自訂觸發器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved