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