前言:实现的功能主要是,oracle登录成功记录登录用户ip地址,登录失败记录登录失败ip地址

1,需要建立一个触发器记录登录成功的客户端用户的ip地址

大家都知道在v$session 中记录着客户端的机器名称,但是没有IP , 如果记录clinet ip 呢?先运行DBMS_SESSION 过程包注册,然后执行存储过程on_logon_trigger,这样当客户端登陆后,在v$session的client_info列会记录其相应的IP信息。

利用 DBMS_SESSION 过程包,先执行

1
2
3
4
5
BEGIN
 
DBMS_SESSION.set_identifier(SYS_CONTEXT('USERENV', 'IP_ADDRESS'));
 
END;

再执行触发器trigger

1
2
3
4
5
6
7
8
9
createorreplacetrigger on_logon_trigger
 
after logon ondatabase
 
begin
 
dbms_application_info.set_client_info(sys_context( 'userenv', 'ip_address' ) );
 
end;

执行这些过程包触发器需要dba权限。

2,然后使用超级管理员通过plsql登录,就可以查看连接上oracle的ip信息:

执行查询SQL:

1
2
3
4
5
6
7
select username,program,machine,client_info,sys_context('userenv','ip_address') as ipadd
 
from v$session s
 
where username isnotnull
 
orderby username,program,machine;

信息如下所示:

3,建立触发器实现登录失败的时候记录日志信息:

写一个触发器,触发器的信息记录在alert日志里面,通过查看alert日志来获取登录失败的用户信息。

触发器如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
CREATE OR REPLACE TRIGGERlogon_denied_to_alert
 
AFTER servererror ON DATABASE
 
DECLARE
 
message VARCHAR2(168);
 
ip VARCHAR2(15);
 
v_os_user VARCHAR2(80);
 
v_module VARCHAR2(50);
 
v_action VARCHAR2(50);
 
v_pid VARCHAR2(10);
 
v_sid NUMBER;
 
v_program VARCHAR2(48);
 
BEGIN
 
IF(ora_is_servererror(1017)) THEN
 
-- get ip FOR remote connections :
 
IF upper(sys_context('userenv', 'network_protocol')) = 'TCP' THEN
 
ip := sys_context('userenv', 'ip_address');
 
END IF;
 
 
 
SELECT sid INTO v_sid FROM sys.v_$mystat WHERE rownum < 2;
 
SELECT p.spid, v.program
 
INTO v_pid, v_program
 
FROM v$process p, v$session v
 
WHERE p.addr = v.paddr
 
AND v.sid = v_sid;
 
 
 
v_os_user := sys_context('userenv', 'os_user');
 
dbms_application_info.read_module(v_module, v_action);
 
 
 
message := to_char(SYSDATE, 'YYYYMMDD HH24MISS') ||
 
' logon denied from ' || nvl(ip,'localhost') || ' ' ||
 
v_pid || ' ' || v_os_user || 'with ' || v_program || ' – ' ||
 
v_module || ' ' || v_action;
 
 
 
sys.dbms_system.ksdwrt(2, message);
 
 
 
ENDIF;
 
END;
 
/

执行报错:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Compilation errors for TRIGGERPOWERDESK.LOGON_DENIED_TO_ALERT
 
 
 
Error: PLS-00201: identifier'SYS.DBMS_SYSTEM' must be declared
 
Line: 35
 
Text: sys.dbms_system.ksdwrt(2, message);
 
 
 
Error: PL/SQL: Statement ignored
 
Line: 35
 
Text: sys.dbms_system.ksdwrt(2, message);

需要赋予权限

grant execute on sys.dbms_system topowerdesk;

之后执行成功了。

4,登录失败查看alert信息

Pslql登录,如下图所示:

再去后台查看alert日志,就会看到失败信息记录:

Fri May 15 19:11:09 2015

20150515 191109 logon denied from192.168.120.169 20934 Administrator with plsqldev.exe ? plsqldev.exe

20150515 191109 logon denied from192.168.120.169 20934 Administrator with plsqldev.exe ? plsqldev.exe

Fri May 15 19:11:18 2015

20150515 191118 logon denied from192.168.120.169 20958 Administrator with plsqldev.exe ? plsqldev.exe

20150515 191118 logon denied from 192.168.120.16920958 Administrator with plsqldev.exe ? plsqldev.exe

Oracle记录登录失败的触发器的更多相关文章

  1. 使用触发器实现记录oracle用户登录失败信息到alert.log日志文件

    前面我们说了用oracle自带的审计功能可以实现记录用户登录失败日志到数据表中(链接:http://www.54ok.cn/6778.html).今天我们来分享一下如何把用户登录失败信息记录到aler ...

  2. oracle审计登录失败用户

    使用sys账号连接数据库,然后执行如下步骤: 1.alter system set audit_trail=db scope=spfile; 2.重启数据库服务 3.AUDIT SESSION WHE ...

  3. 转://因触发器限制导致oracle用户登录失败

    使用PL/SQL DEV登录数据库时,出现如下错误 手工创建了test用户,通过dev工具登录没问题.怀疑数据库中有些用户限制了登录的.再看错误编号:ORA-20001,oracle保留的异常错误号范 ...

  4. Shiro+SpringMVC 实现更安全的登录(加密匹配&登录失败超次数锁定帐号)

    原文:http://blog.csdn.net/wlwlwlwl015/article/details/48518003 前言 初学shiro,shiro提供了一系列安全相关的解决方案,根据官方的介绍 ...

  5. Spring Security之多次登录失败后账户锁定功能的实现

    在上一次写的文章中,为大家说到了如何动态的从数据库加载用户.角色.权限信息,从而实现登录验证及授权.在实际的开发过程中,我们通常会有这样的一个需求:当用户多次登录失败的时候,我们应该将账户锁定,等待一 ...

  6. 使用Oracle的审计功能记录连接数据库登录失败的用户信息

    最近公司有一个项目,用的oracle数据库,整天出现用户被锁的情况,后来百度查了一下,说是用户登录连续出错10次就会被锁住.于是想记录一下看看到底是哪个人在扫数据库的密码.百度了很久才找到方法,下面分 ...

  7. Oracle取消用户连续登录失败次数限制

    当用户连续登录失败次数过多时,Oracle会锁定该用户,“FAILED_LOGIN_ATTEMPTS”用于设置最大次数,超过该值则锁定该帐号. 要取消用户连续登录失败次数的限制可以按照以下方法操作: ...

  8. ORACLE【1】:触发器详解

    转自:http://blog.csdn.net/indexman/article/details/8023740 ORACLE PL/SQL编程之八: 把触发器说透 本篇主要内容如下: 8.1 触发器 ...

  9. ORACLE PL/SQL编程之触发器

    8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2.3 创建替代(INS ...

随机推荐

  1. VSS (Visual Source Safe 2005) 用法详解

    VSS用法指南 The usage of VSS (Visual Source Safe 2005) 1. 首先,当然是得安装好Visual Source Safe 2005 你可以在Visual S ...

  2. git fork同步是什么意思?

    这篇文章主要介绍了git fork同步是什么意思?fork到了哪里?有什么用?怎样用?跟clone有什么差别?本文就一一解释这些问题,须要的朋友能够參考下 官方文档:http://help.githu ...

  3. ThinkPHP项目笔记之函数篇

    说到函数,可能有人会想:框架的C(控制器)通牌都是函数构成的,没有必要讲吧. 当然,我要说的是,公共函数:function.php,该文件就是为了开发一下功能准备的,比方说,某个功能,a地方可用,b地 ...

  4. mysql更改utf8编码方式

    方法1: 一.查看数据库编码格式 1 mysql> show variables like 'character_set_database'; 二.查看数据表的编码格式 1 mysql> ...

  5. C++ STL迭代器与索引相互转换

    0 前言 C++ STL提供了vector.list等模板容器,极大地方便了编程使用. “遍历”是对容器使用的最常用的操作. 使用迭代器来遍历是最好最高效的遍历方法. 当然,对于有些容器的遍历除了使用 ...

  6. Window发声函数Beep、MessageBeep

     C++ Code  1234567891011   WINBASEAPI BOOL WINAPI Beep(__in DWORD dwFreq,      __in DWORD dwDuration ...

  7. Hibernate_day04--课程安排_Hibernate查询方式_对象导航查询_OID查询

    Hibernate_day04 上节内容 今天内容 Hibernate查询方式 对象导航查询 OID查询 HQL查询 查询所有 条件查询 排序查询 分页查询 投影查询 聚集函数使用 QBC查询 查询所 ...

  8. 编程之美 set 7 求数组中的最长递增子序列

    解法 1. 假设在目标数组 array[] 的前 i 个元素中, 最长递增子序列的长度为 LIS[i] 那么状态转移方程为 LIS[i] = max(1, LIS[k]+1) array[i+1] & ...

  9. EF简单查询

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  10. C语言函数的概念

    在<我们对函数进行了简单的解释,函数(Function)是一段可以重复使用的代码,这是从整体上对函数的认识. C语言本身带了很多库函数,并分门别类地放在了不同的头文件中,使用时只要引入对应的头文 ...