`
juji1010
  • 浏览: 117079 次
社区版块
存档分类
最新评论

oracle:获取session的IP地址

阅读更多
方法1


创建触发器:

create orreplace trigger login_on

alfterlogon on database

begin

dbms_application_info.set_client_info(sys_context('userenv','ip_address'));

end;

/



这样以后在连接到DB的session,就会自动在v$session动态视图的client_info列记录session的IP地址了。

从V$SESSION中只能得到机器名, 而通过机器名不能确定到具体的机器. 所以必须得到IP
在oracle中的v$session视图中可以保存有会话的想关信息,包括了客户端的大部分连接信息。其中我们可以将会话的发起ip地址写入到client_identifier和client_info
上文中我们提到了使用userenv函数或者sys_context函数可以获得当前会话的相关信息,其中就包含的有ip_address这一项
当我们使用client_identifier字段来保存登录会话的ip地址的时候,我们需要用到dbms_session.set_identifier过程/函数
当我们使用client_info字段来保存登陆会话的ip地址的时候,我们需要用到dbms_application_info.set_client_info过程/函数


例:查看当前用户的ip地址:
MAI@test > select sys_context('userenv','ip_address') from dual;
SYS_CONTEXT('USERENV','IP_ADDRESS')
-------------------------------------
192.168.77.1


MAI@test > select username,sid,serial#,client_info,client_identifier from v$session where sid=(select sys_context('userenv','sid') from dual);
USERNAME            SID    SERIAL# CLIENT_INFO          CLIENT_IDENTIFIER
--------------- ------- ---------- -------------------- --------------------
MAI                 138      38266
使用client_identifier字段
MAI@test > exec dbms_session.set_identifier(sys_context('userenv','ip_address'));
MAI@test > select username,sid,serial#,client_info,client_identifier from v$session where sid=(select sys_context('userenv','sid') from dual);
USERNAME            SID    SERIAL# CLIENT_INFO          CLIENT_IDENTIFIER
--------------- ------- ---------- -------------------- --------------------
MAI                 138      38270                      192.168.77.1
使用client_info字段
MAI@test > exec dbms_application_info.set_client_info(sys_context('userenv','ip_address'));
MAI@test > select username,sid,serial#,client_info,client_identifier from v$session where sid=(select sys_context('userenv','sid') from dual);
USERNAME            SID    SERIAL# CLIENT_INFO          CLIENT_IDENTIFIER
--------------- ------- ---------- -------------------- --------------------
MAI                 138      38270 192.168.77.1         192.168.77.1


当然,这个过程过程可以通过一个触发器来调用,当每一个新的用户连接开启的时候自动触发该触发器,将相应的ip信息写入v$session的相应字段。
触发器的例子:
create or replace trigger on_login_trigger
after logon on database
begin
dbms_application_info.set_client_info(sys_context('USERENV','IP_ADDRESS'));
end;
/
建立这个trigger需要有dba权限,这样的话,当每个用户新登录的时候,这个触发器就会起作用,然后就能够将客户端的ip地址填充到v$session视图中的client_info字段中:
MAI@test > select username,sid,serial#,client_info,client_identifier from v$session where sid=(select sys_context('userenv','sid') from dual);
USERNAME            SID    SERIAL# CLIENT_INFO          CLIENT_IDENTIFIER
--------------- ------- ---------- -------------------- --------------------
MAI                 149        425 192.168.77.1

方法2


利用sys_context函数我们可以获得当前session的hostname和ip address

SQL> selectsys_context('userenv','host') from dual;

SYS_CONTEXT('USERENV','HOST')
--------------------------------------------------------------
WORKGROUP\IBM-L3YMBNP

SQL> select sys_context('userenv','ip_address') from dual;

SYS_CONTEXT('USERENV','IP_ADDRESS')
-----------------------------------------------------------
127.0.0.1

通过sys_context我们只能获得当前session的信息,如果要获得其他session呢?
这个时候我们就用utl_inaddr包来获取

SQL> selectutl_inaddr.get_host_address('IBM-L3YMBNP') from dual;

UTL_INADDR.GET_HOST_ADDRESS('IBM-L3YMBNP')
-------------------------------------------------------------------
9.181.142.152

而且我们还可以获得sina以及其他web site的ip
SQL> select utl_inaddr.get_host_address('www.sina.com.cn') from dual;

UTL_INADDR.GET_HOST_ADDRESS('WWW.SINA.COM.CN')
---------------------------------------------------------------------
218.30.108.55

其原理是:首先获取域名解析服务器(resolv.conf),在根据host.conf文件确定解析顺序,因为缺省的是hosts文件优先解析,这个时候会又继续读取/etc/hosts文件。

如果hosts文件存在解析关系,则返回信息;如果不存在,则继续问询DNS服务器,获得解析地址,如果不能解析,则会出错
SQL> select utl_inaddr.get_host_address('www.a.com') from dual;
select utl_inaddr.get_host_address('www.a.com') from dual
       *
ERROR 位于第 1 行:
ORA-29257: 未知的主机www.a.com
ORA-06512: 在"SYS.UTL_INADDR", line 35
ORA-06512: 在"SYS.UTL_INADDR", line 40
ORA-06512: 在line 1

基本上就是这样了。
分享到:
评论

相关推荐

    oracle_v$session_v$session_wait用途详解

    - 设置触发器以便在用户登录时自动记录客户端的 IP 地址: ```sql CREATE OR REPLACE TRIGGER on_logon_trigger AFTER LOGON ON DATABASE BEGIN DBMS_APPLICATION_INFO.SET_CLIENT_INFO(SYS_CONTEXT('USERENV'...

    Oracle基于系统级触发器的审计功能

    - `ora_client_ip_address`:获取客户端的IP地址。 - `ora_database_name`:获取当前数据库的名称。 - `ora_dict_obj_name`:获取DDL事件涉及的对象名称。 - `ora_dict_obj_owner`:获取DDL事件涉及的对象所有者。 -...

    oracle中用户连接问题.docx

    本文将详细解释如何查看和管理Oracle中的用户连接,以及如何获取客户端的IP地址。 首先,要查看当前Oracle数据库中的用户连接,你可以使用以下SQL查询: ```sql SELECT username, sid, serial#, status FROM v$...

    oracle的两种连接方式

    在上面的示例中,`"jdbc:oracle:thin:@"` 是Oracle JDBC驱动的URL前缀,`"数据库服务器IP"` 是运行Oracle数据库的服务器IP地址,`"1521"` 是默认的Oracle监听端口号,`"数据库服务名"` 是Oracle实例的服务名。...

    hibernate链接oracle

    例如,这里的`jdbc:oracle:thin:@192.168.0.6:1521:ORCL`表示连接到IP地址为192.168.0.6、监听端口为1521的服务名为ORCL的Oracle实例。 - `username`: 数据库登录用户名,此处设置为`brand`。 - `password`: 数据库...

    hibernate连接oracle的jar包

    其中,`localhost`是数据库服务器的IP地址,`1521`是Oracle监听的默认端口号,`ORCL`是数据库服务名。 4. **Hibernate配置文件**:在`hibernate.cfg.xml`配置文件中,我们需要指定JDBC驱动类、数据库URL、用户名和...

    rhel5+oracle10gr2安装配置

    设置网络IP地址、子网掩码、网关和主机名: ```bash #vi /etc/sysconfig/network NETWORKING=yes NETWORKING_IPV6=no HOSTNAME=oracle.example.com GATEWAY=192.168.1.254 ``` 添加主机名到`/etc/hosts`文件: ``...

    Linux下傻瓜式安装Oracle11g服务器

    同时,如果当前使用的是DHCP分配的IP地址,需要将其改为静态IP地址。 #### 配置操作系统核心参数 为了使Oracle能够正常运行,还需要对操作系统进行一些核心参数的配置: 1. **修改用户的SHELL的限制**: - 编辑`/...

    oracle10在linux上的安装

    - IP 地址:根据实际网络环境自行配置。 2. **创建 Oracle 用户和组**:创建两个用户组 `oinstall` 和 `dba`,以及一个 Oracle 用户账户,并将其加入这两个组中。此外,还需要设置正确的文件所有权和密码。 3. **...

    Linux系统(X64)安装Oracle11g完整安装图文教程另附基本操作

    ### Linux系统(X64)安装Oracle 11g ...- 输入Oracle服务器的IP地址。 - 选择YES进行测试。 - 输入所连接Oracle服务器的用户名和密码。 通过上述步骤,您可以完成Linux (X64) 系统上Oracle 11g的完整安装和基本配置。

    servlet+jsp+oracle(配置连接数据库)的java web项目实例

    2. 创建数据库连接字符串,格式为:jdbc:oracle:thin:@//hostname:port/service_name,其中hostname是Oracle服务器的IP地址,port是监听的端口号,service_name是Oracle的服务名。 3. 在Servlet中编写代码,使用java...

    oracle 常用命令 TXT 最全的

    - 目前为止,Oracle SQL Plus本身不直接支持查询服务器的IP地址。但是可以通过查询操作系统级别的信息来间接获取。 - 如果需要查询服务器的IP地址,可以考虑在SQL Plus外部使用操作系统命令(如Linux下的`ifconfig`...

    linux下安装oracle_11G

    - 配置过程中需要输入连接到的Oracle服务器的实例名、IP地址以及登录凭据。 #### 测试与验证 - 使用SQL*Plus工具登录数据库进行测试:`sqlplus <username>/<password>` #### 结论 通过上述步骤,可以在Linux环境...

    oracle安装.docx

    确保服务器网络正常,可通过以下命令查看IP地址:`ifconfig`。 - 修改主机名为“oracle”,命令为:`hostnamectl set-hostname oracle`。 - 在`/etc/hosts`文件中添加本机IP与主机名对应关系:`192.168.122.134 ...

    多种数据库连接配置(oracle\mysql\access)

    - **Hostname**: 数据库服务器的IP地址或主机名。 - **Port**: Oracle监听器端口号,默认为1521。 - **SID**: System Identifier,标识数据库实例。 - **Service Name**: 在Oracle 12c及更高版本中,服务名替代了SID...

    oracle初级DBA常用命令

    - **描述**: 删除指定IP地址的路由条目。 - **用途**: 管理服务器网络路由,确保数据包正确传输。 通过以上知识点的整理,我们可以更全面地理解Oracle DBA在日常工作中可能涉及到的操作和技术要点。这不仅有助于...

    ORACLE常用問題1000問

    - 要获取Oracle数据库服务器的IP地址,可以使用以下命令: ```sql select sys_context('userenv', 'ip_address') from dual; ``` - 注意:这个命令返回的是客户端连接到数据库所用的IP地址,而非数据库服务器...

    oracle常见问题203问题

    这里的`machine`列将显示用户登录时使用的主机名或IP地址。 #### 八、查询表结构和字段值 - 查询表结构:`DESC table_name`。 - 查询字段值:`SELECT field_name FROM table_name`。 - 查询所有表信息:`SELECT * ...

    oracle 10g安装

    - 导出DISPLAY变量 (`export DISPLAY=xxxxxx:0.0`),其中 `xxxxxx` 需要替换为Xmanager所在计算机的IP地址。 - 运行安装程序 (`./runInstaller`)。 接下来根据提示完成安装过程。可以选择 **Advanced Installation*...

Global site tag (gtag.js) - Google Analytics