• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    Oracle记录登录用户IP的方法小结

    发布者: 福建二哥 | 发布时间: 2025-6-18 09:31| 查看数: 93| 评论数: 0|帖子模式

    在运维场景中,在定位到某个SQL引起系统故障之后,想知道是哪台机器发过来的,方便定位源头,该如何解决?
    在 Oracle 数据库中记录登录用户的 IP 地址可以通过多种方法实现。以下是几种常见的方法,包括使用触发器、审计功能和自定义日志记录。

    方法一:使用触发器记录登录用户的 IP 地址

    创建一个日志表:

    • 创建一个表来存储登录用户的 IP 地址和其他相关信息。
    1. CREATE TABLE login_log (
    2.   log_id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    3.   sid NUMBER,
    4.   username VARCHAR2(30),
    5.   program VARCHAR2(48),
    6.   machine VARCHAR2(64),
    7.   ip_address VARCHAR2(15),
    8.   login_time TIMESTAMP
    9. );
    复制代码
    创建一个触发器

    • 创建一个触发器,在用户登录时自动记录 IP 地址和其他信息。
    1. CREATE OR REPLACE TRIGGER logon_trigger
    2. AFTER LOGON ON DATABASE
    3. BEGIN
    4.   BEGIN
    5.     INSERT INTO login_log (sid, username, program, machine, ip_address, login_time)
    6.     SELECT
    7.       s.sid,
    8.       s.username,
    9.       s.program,
    10.       s.machine,
    11.       SYS_CONTEXT('USERENV', 'IP_ADDRESS'),
    12.       SYSTIMESTAMP
    13.     FROM
    14.       v$session s
    15.     WHERE
    16.       s.audsid = SYS_CONTEXT('USERENV', 'SESSIONID');
    17.   EXCEPTION
    18.     WHEN OTHERS THEN
    19.       -- 记录错误信息
    20.       DBMS_OUTPUT.PUT_LINE('Error in logon_trigger: ' || SQLERRM);
    21.   END;
    22. END;
    23. /
    复制代码
    方法二:使用审计功能记录登录用户的 IP 地址

    启用审计功能

    • 启用 Oracle 的审计功能,记录用户的登录活动。
    1. AUDIT SESSION;
    复制代码
    查询审计日志

    • 使用
      1. DBA_AUDIT_TRAIL
      复制代码
      视图查询审计日志,获取登录用户的 IP 地址
    1. SELECT
    2.   username,
    3.   userhost,
    4.   terminal,
    5.   action_name,
    6.   timestamp#
    7. FROM
    8.   dba_audit_trail
    9. WHERE
    10.   action_name = 'LOGON';
    复制代码
    方法三:使用自定义日志记录

    创建一个日志表

    • 创建一个表来存储登录用户的 IP 地址和其他相关信息。
    1. CREATE TABLE login_log (
    2.   log_id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    3.   sid NUMBER,
    4.   username VARCHAR2(30),
    5.   program VARCHAR2(48),
    6.   machine VARCHAR2(64),
    7.   ip_address VARCHAR2(15),
    8.   login_time TIMESTAMP
    9. );
    复制代码
    创建一个存储过程

    • 创建一个存储过程,用于记录登录用户的 IP 地址。
    1. CREATE OR REPLACE PROCEDURE log_login_info (
    2.   p_sid NUMBER,
    3.   p_username VARCHAR2,
    4.   p_program VARCHAR2,
    5.   p_machine VARCHAR2,
    6.   p_ip_address VARCHAR2
    7. ) IS
    8. BEGIN
    9.   INSERT INTO login_log (sid, username, program, machine, ip_address, login_time)
    10.   VALUES (p_sid, p_username, p_program, p_machine, p_ip_address, SYSTIMESTAMP);
    11. END log_login_info;
    12. /

    13. -- 如果想记录错误信息,参考如下:
    14. CREATE OR REPLACE PROCEDURE log_login_info (
    15.   p_sid NUMBER,
    16.   p_username VARCHAR2,
    17.   p_program VARCHAR2,
    18.   p_machine VARCHAR2,
    19.   p_ip_address VARCHAR2
    20. ) IS
    21. BEGIN
    22.   INSERT INTO login_log (sid, username, program, machine, ip_address, login_time)
    23.   VALUES (p_sid, p_username, p_program, p_machine, p_ip_address, SYSTIMESTAMP);
    24. EXCEPTION
    25.   WHEN OTHERS THEN
    26.     -- 记录错误信息
    27.     DBMS_OUTPUT.PUT_LINE('Error in log_login_info: ' || SQLERRM);
    28. END log_login_info;
    29. /
    复制代码
    创建一个触发器

    • 创建一个触发器,在用户登录时调用存储过程记录 IP 地址。
    1. CREATE OR REPLACE TRIGGER logon_trigger
    2. AFTER LOGON ON DATABASE
    3. BEGIN
    4.   log_login_info(
    5.     SYS_CONTEXT('USERENV', 'SID'),
    6.     SYS_CONTEXT('USERENV', 'SESSION_USER'),
    7.     SYS_CONTEXT('USERENV', 'MODULE'),
    8.     SYS_CONTEXT('USERENV', 'HOST'),
    9.     SYS_CONTEXT('USERENV', 'IP_ADDRESS')
    10.   );
    11. END;
    12. /

    13. -- 如果想记录错误信息,参考如下:
    14. CREATE OR REPLACE TRIGGER logon_trigger
    15. AFTER LOGON ON DATABASE
    16. BEGIN
    17.   BEGIN
    18.     log_login_info(
    19.       SYS_CONTEXT('USERENV', 'SID'),
    20.       SYS_CONTEXT('USERENV', 'SESSION_USER'),
    21.       SYS_CONTEXT('USERENV', 'MODULE'),
    22.       SYS_CONTEXT('USERENV', 'HOST'),
    23.       SYS_CONTEXT('USERENV', 'IP_ADDRESS')
    24.     );
    25.   EXCEPTION
    26.     WHEN OTHERS THEN
    27.       -- 记录错误信息
    28.       DBMS_OUTPUT.PUT_LINE('Error in logon_trigger: ' || SQLERRM);
    29.   END;
    30. END;
    31. /
    复制代码
    方法四:使用 DBMS_NETWORK_ACL_ADMIN 包

    创建一个日志表

    • 创建一个表来存储登录用户的 IP 地址和其他相关信息。
    1. CREATE TABLE login_log (
    2.   log_id NUMBER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
    3.   sid NUMBER,
    4.   username VARCHAR2(30),
    5.   program VARCHAR2(48),
    6.   machine VARCHAR2(64),
    7.   ip_address VARCHAR2(15),
    8.   login_time TIMESTAMP
    9. );
    复制代码
    创建一个触发器

    • 创建一个触发器,在用户登录时记录 IP 地址。
    1. CREATE OR REPLACE TRIGGER logon_trigger
    2. AFTER LOGON ON DATABASE
    3. BEGIN
    4.   INSERT INTO login_log (sid, username, program, machine, ip_address, login_time)
    5.   SELECT
    6.     s.sid,
    7.     s.username,
    8.     s.program,
    9.     s.machine,
    10.     SYS_CONTEXT('USERENV', 'IP_ADDRESS'),
    11.     SYSTIMESTAMP
    12.   FROM
    13.     v$session s
    14.   WHERE
    15.     s.audsid = SYS_CONTEXT('USERENV', 'SESSIONID');
    16. END;
    17. /
    复制代码
    使用 DBMS_NETWORK_ACL_ADMIN 包
    虽然
    1. DBMS_NETWORK_ACL_ADMIN
    复制代码
    包主要用于管理网络访问控制列表(ACL),但它与记录登录用户的 IP 地址没有直接关系。如果你有其他特定的需求,比如限制某些 IP 地址的访问,可以使用
    1. DBMS_NETWORK_ACL_ADMIN
    复制代码
    包来实现。但在这个场景中,我们主要关注的是记录登录用户的 IP 地址,所以不需要使用
    1. DBMS_NETWORK_ACL_ADMIN
    复制代码
    包。

    注意事项


    • 权限

      • 确保你有足够的权限创建表、触发器和存储过程。通常需要
        1. SYSDBA
        复制代码
        1. DBA
        复制代码
        角色。

    • 性能

      • 记录登录信息可能会对性能产生一定影响,特别是在高并发环境下。可以根据实际情况调整记录频率或使用异步记录方法。

    • 安全性

      • 确保日志表的安全性,防止未授权访问和篡改。

    通过以上方法,你可以有效地记录 Oracle 数据库中登录用户的 IP 地址。希望这些方法对你有所帮助!
    以上就是Oracle记录登录用户IP的方法小结的详细内容,更多关于Oracle记录登录用户IP的资料请关注脚本之家其它相关文章!

    来源:https://www.jb51.net/database/333108cdr.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表