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

有时候我们需要把自己的一些信息记录到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;

/


请使用浏览器的分享功能分享到微信等