使用触发器记录Oracle用户登陆信息


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
  • 下一页

相关内容