当前位置:  数据库>oracle

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

    来源: 互联网  发布时间:2017-05-28

    本文导语: 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 触发器应用案例


    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 我安装Samba 3.0.4,能够使用smbclient进行登陆,可是不能使用windowsXP进行登陆
  • 有一台linux服务器,我想在Windows2000的系统上登陆到该linux服务器,使用什么工具登陆比较方便
  • 使用ssh-keygen -t rsa建立密钥之后,可以实现两台linux主机之间的root用户免密码登陆。但无法实现两个普通用户之间免密码登陆
  • 能否使用用户登陆nt的用户名和口令访问nt上的webserver?
  • window2000使用ftp登陆solaris7失败,该如何解决?
  • 我在linux根目录下不慎使用了命令chmod 777 * -R 结果不能登陆了 求高手!!!
  • 我使用的是root用户登陆,但却不能编辑/etc/profile文件,该如何解决。
  • linux安装后如和配置,才可以使用telnet从其它机器去登陆它.50分,急!!!
  • 怎么让windows用户不用登陆就可以查看并使用samba的共享目录?
  • 在MySql中,root 怎样给一个普通登陆者,数据库的使用权
  • 各位老大,没分了,请问如何限用户,使用SSH登陆...立即给分..
  • linux下面怎么设置公共路径阿。想让每个人登陆后都可以使用这个路径里面的命令
  • 请问:使用fdisk/mbr清除bios中登陆选择菜单后,如何恢复?或重设
  • 使用telnet登陆redhat linux为什么没颜色??!!!
  • 如何从Win2000上使用rsh登陆到服务器来执行shell?
  • 我的linux使用普通用户登陆后,不显示用户名,而显示I have no name@localhost#
  • python使用paramiko模块实现ssh远程登陆上传文件并执行
  • mysql导入sql文件命令和mysql远程登陆使用详解
  • C++ I/O 成员 tellg():使用输入流读取流指针
  • 在测试memset函数的执行效率时,分为使用Cash和不使用Cash辆种方式,该如何控制是否使用缓存?
  • C++ I/O 成员 tellp():使用输出流读取流指针
  • 求ibm6000的中文使用手册 !从来没用过服务器,现在急需使用它,不知如何使用! 急!!!!!
  • Python不使用print而直接输出二进制字符串
  • 请问:在使用oracle数据库作开发时,是使用pro*c作开发好些,还是使用库函数如oci等好一些啊?或者它们有什么区别或者优缺点啊?
  • Office 2010 Module模式下使用VBA Addressof
  • 急求结果!!假设一个有两个元素的信号量集S,表示了一个磁带驱动器系统,其中进程1使用磁带机A,进程2同时使用磁带机A和B,进程3使用磁带机B。
  • windows下tinyxml.dll下载安装使用(c++解析XML库)
  • c#中SAPI使用总结——SpVoice的使用方法
  • tcmalloc内存泄露优化c++开源库下载,安装及使用介绍
  • 使用了QWidget的程序,如何使用后台程序启动它?
  • 数据库 iis7站长之家


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,