分享
 
 
 

Oracle中通过触发器来追踪用户的活动

王朝oracle·作者佚名  2008-05-31
窄屏简体版  字體: |||超大  

从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会话ID。你知道,在每个用户登陆Oracle的时候,Oracle就会给每个用户分配一个唯一的会话ID,并把这个ID添加到v$session表中去。我们可以像使用主键一样来使用这个会话ID,这样,这个用户在注销的时候,他的注销信息就可以更新我们的用户审计表。

现在让我们来看一看在我们使用了注销触发器后可以使用的信息。首先,我们更新用户的日志表,使它包含用户(在注销前)的最后一个活动。正像你所看见的一样,更新最后一个活动的这个工作是通过使用SYS context功能,从表v$session中获取活动属性的信息而完成的。

接下来,我们更新我们的审计表来显示在会话期间访问的最后一个程序。再一次,我们使用SYS context功能,从v$session表中选择程序属性这一列。

我们更新用户会话所访问的最后一个模块。这是通过在v$session表中选择模块这个属性列,用它的内容来填充我们的用户审计表来完成的。

最后也是最重要的一个步骤就是添加注销时间,并计算用户在会话中停留的时间。代码中显示的一样,通过使用注销时间数据类型来更新我们的用户登陆表然后计算会话所用的时间。像我早先提及的一样,预先计算每个用户会话的时间将使得审计表中的每一个记录都非常有用,因为它显示了会话过程中的持续时间。

让我们来检查一下系统能够产生的几个报表。为了符合非凡需要,你可以充实/修改一下这些报表。现在,预先计算会话所用时间就显得非常重要了:它可以创建一个更有用的报表。

用户活动报表

使用用户审计表来产生报表可以给作为Oracle数据库治理员得你提供很多重要的信息。我们的第一个报表就是计算总的会话时间。

我们可以创建一个的简单查询来访问我们审计表,用于显示日期、时间、用户ID和用户使用系统的时间。虽然很简单,但是它可以给出每个用户在我们的系统上使用的时间。

这个信息在有不同用户ID使用系统不同区域的时候非凡有用。例如,假如这些Oracle用户ID可以直接显示在屏幕上的话,Oracle治理员就可以得知Oracle应用程序每个区域的使用率。下面,让我们来看看另外一种类型的报表。

具体的用户登陆报表

我们也可以使用同样的表来显示在特定时间使用我们系统的用户数量。这个信息对于负责跟踪用户活动的Oracle数据库治理员非凡有效。

通过在用户审计表中查询用户登陆信息,我们可以在任何给定时间获得精确的用户对话数量。

这些信息可以输入微软的Excel电子表格中,并扩展成为线条图表,如下所示。

正像你看到的,这个图表清楚地显示了在一天中每个小时用户的活动情况。一旦你获得了使用你系统的用户的活动情况,你就可以总结一周里每日的信息或是总结一日里每小时的信息。这就提供了关于用户使用系统的一个信号曲线,通过使用这些信号,我们可以描绘出用户的活动情况。例如,我们可能会发现在每个周三下午一点的时候用户活动非常频繁。通过使用用户审计表,我们可以很快地确定这些用户的并调整Oracle来适应情况的变化,以便于用户的使用。

跟踪

使用系统级触发器,相关的DDL、系统错误和用户活动都可以很轻易地被捕捉到。然而,系统级触发器并不像想象中具有那么多功能,Oracle指出,正在加强系统级触发器的功能,这一版本的Oracle(Oracle 10g)将在2004年发布。

聪明地使用系统登陆/注销触发器可以提供一个很简单而且又很可靠的跟踪机制,用来跟踪Oracle用户的活动信息。对于那些长时间跟踪用户活动的Oracle治理员而言,用户审计表可以为他们提供丰富的用户信息,包括用户使用信息,这个信息可以以每日每时的状态或以每周每日的状态显示。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有