使用觸發器記錄Oracle使用者登陸資訊

來源:互聯網
上載者:User

Oracle 提供了強大的審計功能,可以針對使用者級,系統級範圍,以及標準審計,細粒度審計等多種方式來審計各種資料庫層面上的操作。然很多中小型資料庫需要記錄使用者的登陸登出資訊,而又不希望犧牲太多的效能。基於這種情形,使用基於資料庫層級的觸發器可以簡單的實現這個需求。

1、實現代碼

--建立表用於儲存登陸或登出的統計資訊
CREATE TABLE stats$user_log
(
  user_id          VARCHAR2 (30),
  session_id        NUMBER (8),
  HOST              VARCHAR2 (30),
  last_program      VARCHAR2 (48),
  last_action      VARCHAR2 (32),
  last_module      VARCHAR2 (32),
  logon_day        DATE,
  logon_time        VARCHAR2 (10),
  logoff_day        DATE,
  logoff_time      VARCHAR2 (10),
  elapsed_minutes  NUMBER (8)
);

--建立登陸之後的觸發器
CREATE OR REPLACE TRIGGER logon_audit_trigger
  AFTER LOGON
  ON DATABASE
BEGIN
  INSERT INTO stats$user_log
        VALUES (USER,
                SYS_CONTEXT ('USERENV', 'SESSIONID'),
                SYS_CONTEXT ('USERENV', 'HOST'),
                NULL,
                NULL,
                NULL,
                SYSDATE,
                TO_CHAR (SYSDATE, 'hh24:mi:ss'),
                NULL,
                NULL,
                NULL);
END;
/

--建立登出之後的觸發器
CREATE OR REPLACE TRIGGER logoff_audit_trigger
  BEFORE LOGOFF
  ON DATABASE
BEGIN
  -- ***************************************************
  -- Update the last action accessed
  -- ***************************************************
  UPDATE stats$user_log
      SET last_action =
            (SELECT action
                FROM v$session
              WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = audsid)
    WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = session_id;

  --***************************************************
  -- Update the last program accessed
  -- ***************************************************
  UPDATE stats$user_log
      SET last_program =
            (SELECT program
                FROM v$session
              WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = audsid)
    WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = session_id;

  -- ***************************************************
  -- Update the last module accessed
  -- ***************************************************
  UPDATE stats$user_log
      SET last_module =
            (SELECT module
                FROM v$session
              WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = audsid)
    WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = session_id;

  -- ***************************************************
  -- Update the logoff day
  -- ***************************************************
  UPDATE stats$user_log
      SET logoff_day = SYSDATE
    WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = session_id;

  -- ***************************************************
  -- Update the logoff time
  -- ***************************************************
  UPDATE stats$user_log
      SET logoff_time = TO_CHAR (SYSDATE, 'hh24:mi:ss')
    WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = session_id;

  -- ***************************************************
  -- Compute the elapsed minutes
  -- ***************************************************
  UPDATE stats$user_log
      SET elapsed_minutes = ROUND ( (logoff_day - logon_day) * 1440)
    WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = session_id;
END;
/

更多詳情見請繼續閱讀下一頁的精彩內容:

Oracle觸發器的使用

Oracle觸發器給表自身的欄位重新賦值出現ORA-04091異常

Oracle建立觸發器調用含參數預存程序

Oracle觸發器查詢統計本表

MySQL 觸發器應用案例

  • 1
  • 2
  • 下一頁

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.