ORACLE 中记录客户端MAC地址

群里有人提到,想在系统登录数据库中不仅记录客户端的IP地址,还想记录MAC地址。我网上搜了些资料,初步小结如下。

ORACLE 使用SYS_CONTEXT ('USERENV', 'IP_ADDRESS') ,可以获得客户端的IP地址,而从IP地址转为MAC地址没有现成的PL/SQL函数。网上的一个例子就是通过调用nbtstat -A  ,分析返回结果得到MAC 地址,这个方法适合Oracle 安装在Windows 上,其实类UNIX 机器也可以实现,思路差不多。

整个方法其实就是使用JAVA存储过程。

第一步: 建立GetMacFromIP.JAVA 文件,内容如下:

 

注意,这个JAVA 文件名必须和类名一致。

点击(此处)折叠或打开

  1. import java.io.*;
  2.  public class GetMacFromIP{
  3.     /**
  4.      * 获取MAC地址
  5.      */
  6.     public static String getMac(String ip) {
  7.     String str = “”;
  8.     String macAddress = “”;
  9.     try {
  10.         Process p = Runtime.getRuntime().exec(“nbtstat -A ” + ip);
  11.         InputStreamReader ir = new InputStreamReader(p.getInputStream());
  12.         LineNumberReader input = new LineNumberReader(ir);
  13.         for (int i = 1; i < 100; i++) {
  14.             str = input.readLine();
  15.             if (str != null) {
  16.                 if (str.indexOf(“MAC Address”) > 1) {
  17.                     macAddress = str.substring(str.indexOf(“MAC Address”) + 14, str.length());
  18.                     break;
  19.                 }
  20.             }
  21.         }
  22.     } catch (IOException e) {
  23.         e.printStackTrace(System.out);
  24.     }
  25.     return macAddress;
  26. }


第二步: 编译JAVA文件

javac GetMacFromIP.java

 

这个命令在操作系统命令行下执行,确保你安装了JDK , 如果javac 不在PATH 路径中,则使用带路径名的javac。  执行后生产GetMacFromIP.class

 

第三步:  把JAVA类装载到数据库。

loadjava -user sys/oracle GetMacFromIP.class

 

使用SYS 用户主要是简单考虑,不用赋权。但实际中,最好不用SYS 用户

 

第四步: 创建ORACLE 函数:


点击(此处)折叠或打开

  1. CREATE OR REPLACE FUNCTION GetMac(IP VARCHAR2) RETURN VARCHAR2
  2.  AS LANGUAGE JAVA
  3.  NAME \'GetMacFromIP.getMac(java.lang.String) return java.lang.String\';


 

第五步:测试下这个函数是否正常运行,如:

SQL>  select GetMac('21.104.129.161') from dual;

 

GETMAC('21.104.129.161')

-------------------------------------------------------------------

 

00-0C-29-15-88-5C

 

1 row selected.

 

SQL> select GetMac('21.98.6.83') from dual;

 

GETMAC('21.98.6.83')

-------------------------------------------------------------------

 

44-37-E6-4F-6D-FD

 

1 row selected.

 

第六步:具体操作。


点击(此处)折叠或打开

  1. -- 先建立日志表
  2. Create table logon_log
  3. ( logon_time date ,
  4.   logon_ip varchar2(15),
  5.   logon_mac varchar2(17)
  6.  );
  7.  
  8. -- 建立登录触发器
  9. CREATE OR REPLACE TRIGGER SYS.trg_work_log
  10.    AFTER LOGON
  11.    ON DATABASE
  12. BEGIN
  13.    IF SYS_CONTEXT (\'USERENV\', \'IP_ADDRESS\') IS NOT NULL
  14.    THEN
  15.       INSERT INTO logon_log
  16.            VALUES (
  17.                      SYSDATE,
  18.                      SYS_CONTEXT (\'USERENV\', \'IP_ADDRESS\'),
  19.                      GetMac (SYS_CONTEXT (\'USERENV\', \'IP_ADDRESS\')));
  20.  
  21.       COMMIT;
  22.    END IF;
  23. END;


注意:如果是不带服务名在本机登录,SYS_CONTEXT ('USERENV', 'IP_ADDRESS')返回的是空值,我假设不用记录。当然也可以修改程序去记录。

 

第七步: 正式测试

我选择几台机器登录后,可以查询到:

 

SQL>   select * from logon_log;

 

LOGON_TIM LOGON_IP        LOGON_MAC

--------- --------------- -----------------

08-NOV-14 21.104.129.160  00-0C-29-B1-EF-06

08-NOV-14 21.98.6.83      44-37-E6-4F-6D-FD

08-NOV-14 21.98.6.83      44-37-E6-4F-6D-FD

 

3 rows selected.

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9036/viewspace-1325636/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/9036/viewspace-1325636/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值