Oracle 提供了强大的审计功能,可以针对用户级,系统级范围,以及标准审计,细粒度审计等多种方式来审计各种数据库层面上的操作。然很多中小型数据库需要记录用户的登陆登出信息,而又不希望牺牲太多的性能。基于这种情形,使用基于数据库级别的触发器可以简单的实现这个需求。

1、实现代码

[sql]view plaincopyprint?
  1. --创建表用于存储登陆或登出的统计信息

  2. CREATETABLE stats$user_log

  3. (

  4. user_id VARCHAR2 (30),

  5. session_id NUMBER (8),

  6. HOST VARCHAR2 (30),

  7. last_program VARCHAR2 (48),

  8. last_action VARCHAR2 (32),

  9. last_module VARCHAR2 (32),

  10. logon_day DATE,

  11. logon_time VARCHAR2 (10),

  12. logoff_day DATE,

  13. logoff_time VARCHAR2 (10),

  14. elapsed_minutes NUMBER (8)

  15. );

  16. --创建登陆之后的触发器

  17. CREATEORREPLACETRIGGER logon_audit_trigger

  18. AFTER LOGON

  19. ONDATABASE

  20. BEGIN

  21. INSERTINTO stats$user_log

  22. VALUES (USER,

  23. SYS_CONTEXT ('USERENV', 'SESSIONID'),

  24. SYS_CONTEXT ('USERENV', 'HOST'),

  25. NULL,

  26. NULL,

  27. NULL,

  28. SYSDATE,

  29. TO_CHAR (SYSDATE, 'hh24:mi:ss'),

  30. NULL,

  31. NULL,

  32. NULL);

  33. END;

  34. /

  35. --创建登出之后的触发器

  36. CREATEORREPLACETRIGGER logoff_audit_trigger

  37. BEFORE LOGOFF

  38. ONDATABASE

  39. BEGIN

  40. -- ***************************************************

  41. -- Update the last action accessed

  42. -- ***************************************************

  43. UPDATE stats$user_log

  44. SET last_action =

  45. (SELECTaction

  46. FROM v$session

  47. WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = audsid)

  48. WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = session_id;

  49. --***************************************************

  50. -- Update the last program accessed

  51. -- ***************************************************

  52. UPDATE stats$user_log

  53. SET last_program =

  54. (SELECT program

  55. FROM v$session

  56. WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = audsid)

  57. WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = session_id;

  58. -- ***************************************************

  59. -- Update the last module accessed

  60. -- ***************************************************

  61. UPDATE stats$user_log

  62. SET last_module =

  63. (SELECT module

  64. FROM v$session

  65. WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = audsid)

  66. WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = session_id;

  67. -- ***************************************************

  68. -- Update the logoff day

  69. -- ***************************************************

  70. UPDATE stats$user_log

  71. SET logoff_day = SYSDATE

  72. WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = session_id;

  73. -- ***************************************************

  74. -- Update the logoff time

  75. -- ***************************************************

  76. UPDATE stats$user_log

  77. SET logoff_time = TO_CHAR (SYSDATE, 'hh24:mi:ss')

  78. WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = session_id;

  79. -- ***************************************************

  80. -- Compute the elapsed minutes

  81. -- ***************************************************

  82. UPDATE stats$user_log

  83. SET elapsed_minutes = ROUND ( (logoff_day - logon_day) * 1440)

  84. WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = session_id;

  85. END;

  86. /

--创建表用于存储登陆或登出的统计信息
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_triggerAFTER LOGONON DATABASE
BEGININSERT INTO stats$user_logVALUES (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_triggerBEFORE LOGOFFON DATABASE
BEGIN-- ***************************************************-- Update the last action accessed-- ***************************************************UPDATE stats$user_logSET last_action =(SELECT actionFROM v$sessionWHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = audsid)WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = session_id;--***************************************************-- Update the last program accessed-- ***************************************************UPDATE stats$user_logSET last_program =(SELECT programFROM v$sessionWHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = audsid)WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = session_id;-- ***************************************************-- Update the last module accessed-- ***************************************************UPDATE stats$user_logSET last_module =(SELECT moduleFROM v$sessionWHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = audsid)WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = session_id;-- ***************************************************-- Update the logoff day-- ***************************************************UPDATE stats$user_logSET logoff_day = SYSDATEWHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = session_id;-- ***************************************************-- Update the logoff time-- ***************************************************UPDATE stats$user_logSET logoff_time = TO_CHAR (SYSDATE, 'hh24:mi:ss')WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = session_id;-- ***************************************************-- Compute the elapsed minutes-- ***************************************************UPDATE stats$user_logSET elapsed_minutes = ROUND ( (logoff_day - logon_day) * 1440)WHERE SYS_CONTEXT ('USERENV', 'SESSIONID') = session_id;
END;
/

2、结果样例

[sql]view plaincopyprint?
  1. --查看用户的登入登出信息

  2. SQL> select * from sys.stats$user_log where rownum<3;

  3. USER_ID SESSION_ID HOST LAST_PROGRAM LAST_MODULE LOGON_DAY LOGON_TIME LOGOFF_DA LOGOFF_TIM ELP_MINS

  4. ---------- ---------- --------------- ---------------- ---------------- --------- ---------- --------- ---------- --------

  5. GX_ADMIN 5409517 v2012DB01u JDBC Thin Client JDBC Thin Client 24-OCT-13 12:20:30 24-OCT-13 16:20:30 240

  6. GX_ADMIN 5409518 v2013DB01u JDBC Thin Client JDBC Thin Client 24-OCT-13 12:22:23 24-OCT-13 16:22:30 240

  7. --汇总用户登陆时间

  8. SQL> SELECT user_id, TRUNC (logon_day) logon_day, SUM (elapsed_minutes) total_time

  9. 2 FROM sys.stats$user_log

  10. 3 GROUPBY user_id, TRUNC (logon_day) ORDERBY 2;

  11. USER_ID LOGON_DAY TOTAL_TIME

  12. ------------------------------ --------- ----------

  13. GX_ADMIN 24-OCT-13 960

  14. SYS 24-OCT-13

  15. GX_ADMIN 25-OCT-13 2891

  16. GX_WEBUSER 25-OCT-13

  17. SYS 25-OCT-13

  18. GX_WEBUSER 26-OCT-13

  19. GX_ADMIN 26-OCT-13 2880

  20. SYS 26-OCT-13

  21. GX_WEBUSER 27-OCT-13

  22. GX_ADMIN 27-OCT-13 2640

  23. GX_WEBUSER 28-OCT-13

  24. --Author : Leshami

  25. --Blog : http://blog.csdn.net/leshami

  26. --基于日期时间段的用户登陆数

  27. SQL> select trunc (logon_day) logon_day,substr(logon_time,1,2) hour,count(user_id) as number_of_logins

  28. 2 from sys.stats$user_log

  29. 3 groupby trunc (logon_day) ,substr(logon_time,1,2) orderby 1,2;

  30. LOGON_DAY HOUR NUMBER_OF_LOGINS

  31. --------- ------ ----------------

  32. 24-OCT-13 12 2

  33. 24-OCT-13 16 3

  34. 24-OCT-13 20 2

  35. 24-OCT-13 22 2

  36. 24-OCT-13 23 1

  37. 25-OCT-13 00 2

  38. 25-OCT-13 03 104

  39. 25-OCT-13 04 2

  40. 25-OCT-13 06 2

  41. 25-OCT-13 10 2

  42. 25-OCT-13 14 2

  43. .............

转载于:https://blog.51cto.com/ecloud/1336726

使用触发器记录oracle用户登陆信息相关推荐

  1. oracle查询用户连接记录,记录ORACLE用户登录信息

    首先,建一个表如表名:LOGIN_LOG -- Create table create table LOGIN_LOG ( SESSION_ID INTEGER not null, LOGIN_ON_ ...

  2. 查看登录oracle信息,记录Oracle用户的登录信息

    为了统计哪些用户在登录使用数据库,以及其他用途,需要记录登录数据库的信息,以及尝试登录数据库失败的信息,以下几个trigger可 为了统计哪些用户在登录使用数据库,以及其他用途,需要记录登录数据库的信 ...

  3. oracle查询历史会话,Oracle用户会话信息的查询方法

    Oracle用户会话相信大家都比较了解,下面为您介绍的就是Oracle用户会话信息的查询方法,该方法供您参考,如果您感兴趣的话,不妨一看. 过V$SESSION视图,可以查询Oracle所有Oracl ...

  4. php mysql记录用户行为_PHP实现用session来实现记录用户登陆信息

    PHP中session实现记录用户登录信息的问题,也是PHP面试题中比较常见的考点之一,是PHP学习者必须掌握的一个知识点. 对于初入门的PHP新手来说,或许有一定的难度.那么在之前的文章[PHP中s ...

  5. 用oracle用户登陆toad,配置Toad连接远程Oracle数据库

    当前环境:web 本机系统:Win7 64位sql Toad版本:11 32位数据库 数据库:Oracle 10gspa ===================================ip 与 ...

  6. 使用wireshark从http数据包获取用户登陆信息

    #1.前言 ##1.1声明 文章中的文字可能存在语法错语以及标点错误,请谅解: 如果在文章中发现代码错误或其它问题请告知,感谢! #2.实现过程 若一个网站使用的协议是http的,意味着用户和网站服务 ...

  7. linux 登入用户记录,linux记录所有用户登陆及执行过的命令脚本

    第一个窗口 [root@hdss7-4 ~]# echo " history USER=`whoami` USER_IP=`who -u am i 2>/dev/null| awk ' ...

  8. oracle追踪触发器语句,Oracle中怎样通过触发器来追踪用户的活动?

    从Oracle8i开始,Oracle引入了特殊的触发器,这些触发器并不是和特殊的DML事件相关联的(DML事件,如,INSERT,UPDATE和DELETE).这些系统级别的触发器包括数据库启动触发器 ...

  9. oracle用户的追踪文件,Oracle中怎样通过触发器来追踪用户的活动?

    从Oracle8i开始,Oracle引入了特殊的触发器,这些触发器并不是和特殊的DML事件相关联的(DML事件,如,INSERT,UPDATE和DELETE).这些系统级别的触发器包括数据库启动触发器 ...

最新文章

  1. MySQL 不落地迁移、导入 PostgreSQL - 推荐 rds_dbsync
  2. 在ssh项目中的中配置数据源c3p0
  3. ecs硬盘数据迁移_阿里云ECS新增数据盘以及迁移数据方法
  4. GCD API 理解 (一)
  5. 4KB/2MB PAE分页模式下的线性地址翻译以及CR3
  6. WampServer服务器离线问题的解决方法
  7. 设计模式—适配器模式(思维导图)
  8. 设计模式(9)——模板方法模式
  9. 如何开启刷题,蓝桥杯练习系统
  10. 基于STM32的频率计Proteus仿真教程
  11. [程序人生] [随笔感悟] -- 2018,我的博客年
  12. python项目总结与展望_2018年度总结,2019展望未来
  13. Power BI中使用图片作为切片器
  14. python_pygame.外星人入侵
  15. qt,QGraphicsView实现鼠标中键拖动图片,鼠标滚轮缩放、两个窗口联动左键选点等功能(c++pyqt两个版本)
  16. Android基础入门教程——10.1 TelephonyManager(电话管理器)
  17. DPI、PPI、DP、PX 的详细计算方法及算法来源是什么
  18. 同花顺_知识_看盘技法
  19. 简单三步 用Yolov5快速训练自己的数据集
  20. Redis数据类型——set

热门文章

  1. 以太坊开发入门,完整入门篇
  2. Sklearn-RandomForest
  3. OkHttp 3.x 源码解析之Dispatcher分发器
  4. 《区块链原理、设计与应用》一3.8 本章小结
  5. 编写GO的WEB开发框架 (十三): 配置文件读取
  6. eclipse 中设置注释模板
  7. eclipse的workspace和working set
  8. nutch2.1抓取中文网站
  9. java.io.IOException: CreateProcess error=2, ?????????
  10. hql与sql的区别(转)