ORACLE 中記錄客戶端MAC地址
群裡有人提到,想在系統登入資料庫中不僅記錄客戶端的IP地址,還想記錄MAC地址。我網上搜了些資料,初步小結如下。
ORACLE 使用SYS_CONTEXT ('USERENV', 'IP_ADDRESS') ,可以獲得客戶端的IP地址,而從IP地址轉為MAC地址沒有現成的PL/SQL函式。網上的一個例子就是透過呼叫nbtstat
-A
整個方法其實就是使用JAVA儲存過程。
第一步: 建立GetMacFromIP.JAVA 檔案,內容如下:
注意,這個JAVA 檔名必須和類名一致。
點選(此處)摺疊或開啟
-
import java.io.*;
-
public class GetMacFromIP{
-
/**
-
* 獲取MAC地址
-
*/
-
public static String getMac(String ip) {
-
String str = “”;
-
String macAddress = “”;
-
try {
-
Process p = Runtime.getRuntime().exec(“nbtstat -A ” + ip);
-
InputStreamReader ir = new InputStreamReader(p.getInputStream());
-
LineNumberReader input = new LineNumberReader(ir);
-
for (int i = 1; i < 100; i++) {
-
str = input.readLine();
-
if (str != null) {
-
if (str.indexOf(“MAC Address”) > 1) {
-
macAddress = str.substring(str.indexOf(“MAC Address”) + 14, str.length());
-
break;
-
}
-
}
-
}
-
} catch (IOException e) {
-
e.printStackTrace(System.out);
-
}
-
return macAddress;
- }
第二步: 編譯JAVA檔案
javac GetMacFromIP.java
這個命令在作業系統命令列下執行,確保你安裝了JDK , 如果javac 不在PATH 路徑中,則使用帶路徑名的javac。 執行後生產GetMacFromIP.class
第三步: 把JAVA類裝載到資料庫。
loadjava -user sys/oracle GetMacFromIP.class
使用SYS 使用者主要是簡單考慮,不用賦權。但實際中,最好不用SYS 使用者
第四步: 建立ORACLE 函式:
點選(此處)摺疊或開啟
-
CREATE OR REPLACE FUNCTION GetMac(IP VARCHAR2) RETURN VARCHAR2
-
AS LANGUAGE JAVA
- 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.
第六步:具體操作。
點選(此處)摺疊或開啟
-
-- 先建立日誌表
-
Create table logon_log
-
( logon_time date ,
-
logon_ip varchar2(15),
-
logon_mac varchar2(17)
-
);
-
-
-- 建立登入觸發器
-
CREATE OR REPLACE TRIGGER SYS.trg_work_log
-
AFTER LOGON
-
ON DATABASE
-
BEGIN
-
IF SYS_CONTEXT (\'USERENV\', \'IP_ADDRESS\') IS NOT NULL
-
THEN
-
INSERT INTO logon_log
-
VALUES (
-
SYSDATE,
-
SYS_CONTEXT (\'USERENV\', \'IP_ADDRESS\'),
-
GetMac (SYS_CONTEXT (\'USERENV\', \'IP_ADDRESS\')));
-
-
COMMIT;
-
END IF;
- 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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 獲取客戶端Mac地址客戶端Mac
- oracle取客戶端網路卡地址Oracle客戶端
- ASP.NET獲取客戶端IP及MAC地址ASP.NET客戶端Mac
- JSF/JAVA 根據IP獲取客戶端Mac地址JSJava客戶端Mac
- 青芒 for Mac客戶端開發筆記Mac客戶端筆記
- bilibili mac客戶端 嗶哩嗶哩 b站mac客戶端Mac客戶端
- 在Intranet中獲得客戶端IP地址客戶端
- Mac版YouTube客戶端Mac客戶端
- Termius for Mac(SSH客戶端)Mac客戶端
- Termius mac(SSH客戶端)Mac客戶端
- SmartSVN for Mac(SVN客戶端)Mac客戶端
- Git客戶端:Fork for MacGit客戶端Mac
- 客戶主記錄中的資料
- 一次獲取客戶端 IP 記錄客戶端
- 客戶端筆記客戶端筆記
- 獲取SQL Server中連線的客戶端IP地址SQLServer客戶端
- ICAP: 互換客戶端地址協議客戶端協議
- 中斷客戶端客戶端
- 顯示連線Oracle資料庫的客戶端IP地址Oracle資料庫客戶端
- MacFTP客戶端——Transmit 5 for MacMacFTP客戶端MIT
- Tower for Mac Git客戶端MacGit客戶端
- Twitterrific for Mac twitter客戶端Mac客戶端
- SourceTree for Mac(Git客戶端工具)MacGit客戶端
- 老牌Git客戶端SmartGit for MacGit客戶端Mac
- Transmit 5 for Mac(FTP客戶端)MITMacFTP客戶端
- SmartSVN 14 Mac(SVN客戶端)Mac客戶端
- Open客戶端Viscosity for Mac客戶端Mac
- SSH客戶端Termius for Mac 7.34.1客戶端Mac
- Oracle 客戶端安裝Oracle客戶端
- oracle客戶端升級Oracle客戶端
- oracle客戶端安裝Oracle客戶端
- 為oracle客戶端瘦身:Oracle客戶端
- Mac OS X 10.6.8下安裝Oracle客戶端MacOracle客戶端
- 監控database上的客戶端ip地址Database客戶端
- gRPC學習記錄(六)--客戶端連線池RPC客戶端
- Mactwitter客戶端——Twitterrific for MacMac客戶端
- SmartGit 21 for Mac(老牌Git客戶端)GitMac客戶端
- Mac Git客戶端工具TowerMacGit客戶端