从Oracle8i开始,Oracle引入了特殊的触发器,这些触发器并不是和特殊的DML事件相关联的(DML事件,如,INSERT,UPDATE和DELETE)。这些系统级别的触发器包括数据库启动触发器,DDL触发器和最终用户登陆/注销触发器。

当Oracle提供了这些新的触发器的功能后,却还不清楚该如何使用这些触发器来追踪系统的使用情况。这篇文章描述了我是如何使用创建终端用户登陆/注销的方法来追踪终端用户的活动的。刚开始实行的追踪终端用户系统级触发器是非常新的,就因为它非常的新,所以它在功能上还是不够完善。

虽然用户登陆/注销触发器会告诉你用户登陆和用户注销的准确时间,可是代码却无法获取在用户会话阶段所进行活动的任何信息。 这些用户的登陆/注销触发器对于使用时间戳用户的应用程序而言是非常有用的。所谓的时间戳用户,就是那些在访问应用程序的时候被给定一个唯一的Oracle用户ID的人。

不使用时间戳Oracle用户ID的应用程序使用这些登陆/注销触发器可能没有什么用。 既然我们知道了基本的知识,那么,让我们看看该如何设计用户审计表来追踪用户的活动。 设计一个用户审计表 第一步就是创建一个用于存储终端用户登陆/注销触发器信息的Oracle表。

为了合理地设计这些触发器,让我们先来看看系统级的触发器。首先,我们在登陆的时候就会获取以下信息: 用户 ID—用户的ID ,用于执行登陆操作; 会话 ID—Oracle为用户控制会话的ID; 主机—计算机的名称; 登陆时间—一个用户登陆时间一样的Oracle时间数据类型,精确到0。

001秒。 现在,我们将获得仅仅优先于用户注销的信息。当用户在注销的时候,Oracle系统级触发器就可以提供这个用户当前的会话状态和活动信息: 最后的程序—用户在注销时执行的最后一个程序的名称。 最后的活动—用户在会话种执行的最后一个活动。 最后的模块—用户在注销前访问的最后一个模块的名称。

注销时间—一个和用户实际注销时间一样的一个Oracle时间数据类型,精确到0。001秒。 现在,我们知道了登陆和注销的信息,那么我们如何搜集这些信息,并管理它们呢?让我们来看看可用的选择。 用户表的标准化 因为用户的登陆/注销触发器是两个分离的实体,所以我们在设计支持存放这些信息的表的时候就可以有多种选择。

我们可以设计两个隔离的表格:一个用户登陆表和一个用户注销表。如果我们这样做了,那么在把这两个表连接起来的时候和判断哪个用户的登陆引起了哪个用户的注销等等事情的时候就会有困难。这个投机取巧的方法可能会给错误的产生制造机会。诸如,用户24在登陆前是如何注销的?等等。

现在,让我们考虑一个更好的选择。为了很好的使用表的信息,我们可以创建一个数据库,它里面包含一个单一的表,用于记录登陆和注销时间信息。这个方法就省去了连接表和关联数据的麻烦。另外,我们还将创建一个区域,用于计算每个用户在特定会话中所用去的时间。

这个计算预先由触发器做好,这样就可以节省时间,并且可以创建一个丰富的报表,这个我们后面会提到。 设计一个登陆触发器 一旦表格设计好了以后,接下来的步骤就是创建一个系统级的登陆触发器,它可以在发生登陆时间的时候记录尽可能多的信息。我创建的登陆审计触发器。

正像你看到的一样,我在这个表中创建了一些在登陆时可以使用到的信息值: 用户—建立Oracle会话的Oracle用户ID 会话ID—使用Oracle的SYS context功能从v$session 表中直接获取Oracle的会话ID。主机—使用Oracle的SYS context功能,在Oracle会话被创建的时候获取主机名。

请注意,对于使用Oracle并行服务器或者实际应用群的时候,获取主机名是非常重要的,因为我们可能同时和许多不同的远程主机都有会话连接。 登陆时间—获取实际工作登陆的时间,精确到0。001秒。请注意我们是如何把登陆时间划分成两个区域的。产生一个登陆日期和一个登陆时间可以给最后的报表带来很强的可读性。

既然登陆触发器已经创建好了,我们就需要创建一个注销触发器来获取用户完成会话的所有信息。

全部

oracle追踪触发器语句,Oracle中怎样通过触发器来追踪用户的活动?相关推荐

  1. column ambiguously defined oracle数据库分页语句查询中select嵌套时出错

    column ambiguously defined &oracle数据库分页语句查询中select嵌套时出错 转载于 [ lev草梦的博客](http://blog.sina.com.cn/ ...

  2. 什么是存储过程?什么是触发器?SQL中存储过程与触发器的区别是什么?

    什么是存储过程?什么是触发器?SQL中存储过程与触发器的区别是什么? 存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,它存储在数据库中,一次编译后永久有效,用户通过指定存储过程的名 ...

  3. oracle 停止触发器语句,oracle触发器语句

    ORACLE中触发器的判断IF语句 加一行 NULL 即可例如:SQL> DECLARE 2 testvalue INT; 3 BEGIN 4 testvalue := 200; 5 6 IF ...

  4. oracle的分支语句,Oracle中的分支语句

    Oracle中的分支语句,Oracle条件分支语句:pl/sql中提供了三种分支语句:if-- then, if---then--else,if--then--ifesle,Oracle条 Oracl ...

  5. oracle数据定义语句,oracle(sql)基础篇系列(3)——数据维护语句、数据定义语句、伪列...

    oracle(sql)基础篇系列(三)--数据维护语句.数据定义语句.伪列 DML语句 insert 向表中插入新的记录 --三种插入方式 --(1)不写字段的名字,直接按照字段的顺序把值逐个往里插 ...

  6. oracle+执行变量语句,ORACLE sql 语句的执行过程(SQL性能调整)

    第1章 SQL语句处理的过程 在调整之前我们需要了解一些背景知识,只有知道这些背景知识,我们才能更好的去调整sql语句. 本节介绍了SQL语句处理的基本过程,主要包括: · 查询语句处理 · DML语 ...

  7. oracle使用表空间语句,oracle表空间语句

    Oracle表空间创建语句,急 //创建临时表空间 create temporary tablespace test_temp tempfile 'E:\oracle\product\10.2.0\o ...

  8. oracle 生成 sql语句,Oracle使用SQL语句生成日历的实现方法

    Oracle使用SQL语句可以实现日历的功能,下面就为您详细介绍Oracle使用SQL语句生成日历的实现方法,希望对您能有所帮助. 1 要构造某年某月的日历,必须先知道这个月的开始时间,结束时间及天数 ...

  9. oracle+生成+sql语句,Oracle使用SQL语句生成日历的实现方法

    Oracle使用SQL语句可以实现日历的功能,下面就为您详细介绍Oracle使用SQL语句生成日历的实现方法,希望对您能有所帮助. 1 要构造某年某月的日历,必须先知道这个月的开始时间,结束时间及天数 ...

最新文章

  1. 独家 | 构建端到端数据科学项目,从我的Data Scientist Ideal Profiles项目中学习(附链接)...
  2. Unity Shader-描边效果
  3. gcd的二进制优化笔记
  4. 六年级上学期计算机上册教案,六年级上册数学全册教案
  5. C++成员变量初始化顺序问题
  6. MongoDB服务启动与停止命令(Windows环境)
  7. 程序运行正常,数据库没反应
  8. Python可视化中Matplotlib(4.三种设置样式方法、设置坐标刻度以及标签、设置显示出特殊字符)
  9. JS中闭包的应用自定义JS模块2
  10. 通过Rancher安装K8s
  11. RedisTemplate设置过期时间
  12. 数据库名、实例名和ORACLE_SID的区别
  13. BZOJ 1070: [SCOI2007]修车
  14. Web播放器学习笔记(二) 1 Bit Audio Player
  15. 计算机组成原理完整学习笔记(七):CPU 的结构与功能
  16. ElasticSearch配置集群
  17. G1 Concurrent Refinement Thread 在干啥?
  18. 修复win10 服务器失败怎么办,fatal error怎么解决win10 修复Win10系统问题
  19. 骨传导耳机工作原理,骨传导耳机优缺点
  20. 元学习入门:MAML

热门文章

  1. ]数据结构:单链表之判断两个链表是否相交及求交点(带环、不带环)
  2. [UWP]做个调皮的BusyIndicator
  3. 八大排序算法的python实现(三)冒泡排序
  4. java基础----Java中枚举的使用(一)
  5. lanmp之二 (奇葩问题)
  6. 2015-8-10工作日志
  7. 让窗体接受拖放, 并获取拖过来的文件信息 - 回复 海浪问 的问题
  8. MySQL源码解读之数据结构-LF_DYNARRAY
  9. 北航博士,研究所月入两万
  10. 做梦也想有一个这样的实验室