在oracle数据库中,通过gv$session视图只能查询到登陆的会话的机器名信息,无法获取准确的IP地址。应该如何处理呢?
方法一:
该方法适用于查询历史的登陆信息的IP地址,但是如果关闭了监听日志的情况下该方法不适用。
如果开启了监听日志,那么我们可能根据时间范围查找对应的监听日志来获取IP地址信息。
监听日志存放路径默认为:ORACLE_BASE 下的\diag\tnslsnr\zlsoft-9e1e6253\listener\trace\listener.log
方法二:
该方法需要先执行触发器,后续在gv$session视图中就可以查询到执行触发器后所有会话的IP地址信息。
步骤一:
适用SYS用户或其他DBA用户执行如下的触发器
create or replace trigger on_logon_trigger
after logon on database
begin
dbms_application_info.set_client_info(sys_context('userenv',
'ip_address'));
end;
步骤二:
查询v$session视图中的clirnt_info字段,该字段记录了IP地址信息
select t.client_info,t.MACHINE,t.SID,t.SERIAL#,t.PROGRAM,t.LOGON_TIME,t.USERNAME from v$session t where t.logon_time>sysdate-1
方法三:
可以通过触发器的方式将客户端登陆的信息记录到自己创建中间表中
触发器示例:
create or replace trigger tri_logon after logon on database
begin
insert into LOGON_TABLE
( logon_time,
username,
host,
os_user,
ip_address
)
values
( sysdate,
sys_context('USERENV', 'SESSION_USER'),
sys_context('USERENV','HOST'),
sys_context('USERENV','OS_USER'),
sys_context('USERENV','IP_ADDRESS'));
end;