Oracle記錄登錄用戶IP的方法小結(jié)
在運維場景中,在定位到某個SQL引起系統(tǒng)故障之后,想知道是哪臺機器發(fā)過來的,方便定位源頭,該如何解決?
在 Oracle 數(shù)據(jù)庫中記錄登錄用戶的 IP 地址可以通過多種方法實現(xiàn)。以下是幾種常見的方法,包括使用觸發(fā)器、審計功能和自定義日志記錄。
方法一:使用觸發(fā)器記錄登錄用戶的 IP 地址
創(chuàng)建一個日志表:
- 創(chuàng)建一個表來存儲登錄用戶的 IP 地址和其他相關(guān)信息。
CREATE TABLE login_log ( log_id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, sid NUMBER, username VARCHAR2(30), program VARCHAR2(48), machine VARCHAR2(64), ip_address VARCHAR2(15), login_time TIMESTAMP );
創(chuàng)建一個觸發(fā)器:
- 創(chuàng)建一個觸發(fā)器,在用戶登錄時自動記錄 IP 地址和其他信息。
CREATE OR REPLACE TRIGGER logon_trigger AFTER LOGON ON DATABASE BEGIN BEGIN INSERT INTO login_log (sid, username, program, machine, ip_address, login_time) SELECT s.sid, s.username, s.program, s.machine, SYS_CONTEXT('USERENV', 'IP_ADDRESS'), SYSTIMESTAMP FROM v$session s WHERE s.audsid = SYS_CONTEXT('USERENV', 'SESSIONID'); EXCEPTION WHEN OTHERS THEN -- 記錄錯誤信息 DBMS_OUTPUT.PUT_LINE('Error in logon_trigger: ' || SQLERRM); END; END; /
方法二:使用審計功能記錄登錄用戶的 IP 地址
啟用審計功能:
- 啟用 Oracle 的審計功能,記錄用戶的登錄活動。
AUDIT SESSION;
查詢審計日志:
- 使用
DBA_AUDIT_TRAIL
視圖查詢審計日志,獲取登錄用戶的 IP 地址
SELECT username, userhost, terminal, action_name, timestamp# FROM dba_audit_trail WHERE action_name = 'LOGON';
方法三:使用自定義日志記錄
創(chuàng)建一個日志表:
- 創(chuàng)建一個表來存儲登錄用戶的 IP 地址和其他相關(guān)信息。
CREATE TABLE login_log ( log_id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, sid NUMBER, username VARCHAR2(30), program VARCHAR2(48), machine VARCHAR2(64), ip_address VARCHAR2(15), login_time TIMESTAMP );
創(chuàng)建一個存儲過程:
- 創(chuàng)建一個存儲過程,用于記錄登錄用戶的 IP 地址。
CREATE OR REPLACE PROCEDURE log_login_info ( p_sid NUMBER, p_username VARCHAR2, p_program VARCHAR2, p_machine VARCHAR2, p_ip_address VARCHAR2 ) IS BEGIN INSERT INTO login_log (sid, username, program, machine, ip_address, login_time) VALUES (p_sid, p_username, p_program, p_machine, p_ip_address, SYSTIMESTAMP); END log_login_info; / -- 如果想記錄錯誤信息,參考如下: CREATE OR REPLACE PROCEDURE log_login_info ( p_sid NUMBER, p_username VARCHAR2, p_program VARCHAR2, p_machine VARCHAR2, p_ip_address VARCHAR2 ) IS BEGIN INSERT INTO login_log (sid, username, program, machine, ip_address, login_time) VALUES (p_sid, p_username, p_program, p_machine, p_ip_address, SYSTIMESTAMP); EXCEPTION WHEN OTHERS THEN -- 記錄錯誤信息 DBMS_OUTPUT.PUT_LINE('Error in log_login_info: ' || SQLERRM); END log_login_info; /
創(chuàng)建一個觸發(fā)器:
- 創(chuàng)建一個觸發(fā)器,在用戶登錄時調(diào)用存儲過程記錄 IP 地址。
CREATE OR REPLACE TRIGGER logon_trigger AFTER LOGON ON DATABASE BEGIN log_login_info( SYS_CONTEXT('USERENV', 'SID'), SYS_CONTEXT('USERENV', 'SESSION_USER'), SYS_CONTEXT('USERENV', 'MODULE'), SYS_CONTEXT('USERENV', 'HOST'), SYS_CONTEXT('USERENV', 'IP_ADDRESS') ); END; / -- 如果想記錄錯誤信息,參考如下: CREATE OR REPLACE TRIGGER logon_trigger AFTER LOGON ON DATABASE BEGIN BEGIN log_login_info( SYS_CONTEXT('USERENV', 'SID'), SYS_CONTEXT('USERENV', 'SESSION_USER'), SYS_CONTEXT('USERENV', 'MODULE'), SYS_CONTEXT('USERENV', 'HOST'), SYS_CONTEXT('USERENV', 'IP_ADDRESS') ); EXCEPTION WHEN OTHERS THEN -- 記錄錯誤信息 DBMS_OUTPUT.PUT_LINE('Error in logon_trigger: ' || SQLERRM); END; END; /
方法四:使用 DBMS_NETWORK_ACL_ADMIN 包
創(chuàng)建一個日志表:
- 創(chuàng)建一個表來存儲登錄用戶的 IP 地址和其他相關(guān)信息。
CREATE TABLE login_log ( log_id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, sid NUMBER, username VARCHAR2(30), program VARCHAR2(48), machine VARCHAR2(64), ip_address VARCHAR2(15), login_time TIMESTAMP );
創(chuàng)建一個觸發(fā)器:
- 創(chuàng)建一個觸發(fā)器,在用戶登錄時記錄 IP 地址。
CREATE OR REPLACE TRIGGER logon_trigger AFTER LOGON ON DATABASE BEGIN INSERT INTO login_log (sid, username, program, machine, ip_address, login_time) SELECT s.sid, s.username, s.program, s.machine, SYS_CONTEXT('USERENV', 'IP_ADDRESS'), SYSTIMESTAMP FROM v$session s WHERE s.audsid = SYS_CONTEXT('USERENV', 'SESSIONID'); END; /
使用 DBMS_NETWORK_ACL_ADMIN 包
雖然 DBMS_NETWORK_ACL_ADMIN
包主要用于管理網(wǎng)絡訪問控制列表(ACL),但它與記錄登錄用戶的 IP 地址沒有直接關(guān)系。如果你有其他特定的需求,比如限制某些 IP 地址的訪問,可以使用 DBMS_NETWORK_ACL_ADMIN
包來實現(xiàn)。但在這個場景中,我們主要關(guān)注的是記錄登錄用戶的 IP 地址,所以不需要使用 DBMS_NETWORK_ACL_ADMIN
包。
注意事項
- 權(quán)限:
- 確保你有足夠的權(quán)限創(chuàng)建表、觸發(fā)器和存儲過程。通常需要
SYSDBA
或DBA
角色。
- 確保你有足夠的權(quán)限創(chuàng)建表、觸發(fā)器和存儲過程。通常需要
- 性能:
- 記錄登錄信息可能會對性能產(chǎn)生一定影響,特別是在高并發(fā)環(huán)境下。可以根據(jù)實際情況調(diào)整記錄頻率或使用異步記錄方法。
- 安全性:
- 確保日志表的安全性,防止未授權(quán)訪問和篡改。
通過以上方法,你可以有效地記錄 Oracle 數(shù)據(jù)庫中登錄用戶的 IP 地址。希望這些方法對你有所幫助!
以上就是Oracle記錄登錄用戶IP的方法小結(jié)的詳細內(nèi)容,更多關(guān)于Oracle記錄登錄用戶IP的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Oracle數(shù)據(jù)庫正則表達式使用場景代碼實例
這篇文章主要介紹了Oracle數(shù)據(jù)庫正則表達式使用場景代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-09-09Oracle將字符編碼從GBK轉(zhuǎn)到UTF8,如何操作比較穩(wěn)妥?
有個學校oracle數(shù)據(jù)庫的編碼是GBK,而且?guī)炖镞呉呀?jīng)有很多生產(chǎn)數(shù)據(jù)了,現(xiàn)在想改成UTF8的,如果執(zhí)行了這步操作,會出現(xiàn)哪些問題2014-02-02Oracle基礎(chǔ)多條sql執(zhí)行在中間的語句出現(xiàn)錯誤時的控制方式
今天小編就為大家分享一篇關(guān)于Oracle基礎(chǔ)多條sql執(zhí)行在中間的語句出現(xiàn)錯誤時的控制方式,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12解決Oracle19c?ORA-00904:“WMSYS“.“WM_CONCAT“:標識符無效問題
這篇文章主要介紹了解決Oracle19c?ORA-00904:“WMSYS“.“WM_CONCAT“:標識符無效問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07