ITPub博客

首页 > 数据库 > Oracle > 第40期 通过dbms_system.ksdwrt把日志写到alter文件中

第40期 通过dbms_system.ksdwrt把日志写到alter文件中

原创 Oracle 作者:pxbibm 时间:2025-05-06 12:57:43 0 删除 编辑

有时候我们需要把自己的一些信息记录到oracle的alter告警日志中,我有一个这样的场景,要记录那些客户端ip地址访问了数据库服务器,并把这些信息记录到alter告警日志。

定义一个存储过程,记录数据库的白名单信息,实现只有是白名单的客户,才能访问数据库,并且把访问的客户信息记录到

alter告警日志中。

在alter告警日志中,记录只有10.10.30.85的客户端才能访问数据库,并在alter告警日志中记录客户端是什么时候哪个用户访问的。

CREATE OR REPLACE PROCEDURE check_client_access AS

  v_ip_address VARCHAR2(150);

  message      varchar2(400);

BEGIN

  SELECT SYS_CONTEXT('USERENV', 'IP_ADDRESS') INTO v_ip_address FROM dual;

  IF v_ip_address = '10.10.30.85' THEN

    message := to_char(sysdate, 'Mon dd HH24:MI:SS YYYY') ||

               ' logon success from ' || v_ip_address || ' ' ||

               ' user: PT_QUERY;';

    sys.dbms_system.ksdwrt(2, message);

  ELSE

    RAISE_APPLICATION_ERROR(-20001,

                            'Access denied for client IP address: ' ||

                            v_ip_address);

  END IF;

END;

/

定义一个触发器,当客户端登陆数据库时进行验证。


CREATE OR REPLACE TRIGGER restrict_client_access

  AFTER LOGON ON DATABASE

DECLARE

  STR_SCHEMANAME   VARCHAR2(40);

  STR_OSUSER       VARCHAR2(40);

  STR_PROGRAM      VARCHAR2(60);

  STR_DATABASEROLE VARCHAR2(40);

BEGIN

  select DATABASE_ROLE INTO STR_DATABASEROLE from V$DATABASE;

  IF STR_DATABASEROLE = 'PRIMARY' THEN

    SELECT USERNAME, OSUSER, PROGRAM

      INTO STR_SCHEMANAME, STR_OSUSER, STR_PROGRAM

      FROM V$SESSION

     WHERE audsid = USERENV('SESSIONID');

    IF STR_SCHEMANAME = 'PT_QUERY' THEN

      check_client_access;

    END IF;

  END IF;

END;

/


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

请登录后发表评论 登录
全部评论
Oracle ACE。ACOUG核心成员,Oracle用户组年轻专家。熟悉Oracle的体系结构,擅长Oracle数据库架构规划、SQL优化、OWI方面性能的优化。曾服务于航天、航空、机车、大型制造行业数据库的维护以及系统开发工作,开发过基于Oracle数据库的大型ERP系统。
  • 博文量
    345
  • 访问量
    2477938