使用 Oracle 触发器填充表

问题描述 投票:0回答:1

我正在尝试跟踪失败的用户登录 Oracle 数据库以进行监控。该计划是在数据库登录时使用 Oracle 触发器。表已创建,触发器与表关联成功。表 CREATE 语句和 TRIGGER 成功。当检查表值时,oracle 没有返回任何记录。我怎样才能做到这一点?

--创建表 创建表 myschema.errors( user_name VARCHAR2(30) NOT NULL 启用, error_code VARCHAR2(50) NOT NULL ENABLE, error_message VARCHAR2(50) NOT NULL 启用, error_time 时间戳) 表空间“用户”;

--创建应用程序上下文 使用 myschema.myschema6_pkg 创建上下文 myschema6_ctx;

--创建包体 创建或替换包体 myschema.myschema6_pkg 是 c_context CONSTANT VARCHAR2(30) := 'myschema6_ctx'; 用户名 VARCHAR2(30); 我的_USER VARCHAR2(30);

        PROCEDURE set_contexts IS 
        BEGIN 
        SELECT SYS_CONTEXT ('USERENV', 'SESSION_USER') into username FROM DUAL;
        SELECT SYS_CONTEXT ('USERENV', 'OS_USER') into My_USER FROM DUAL;
        DBMS_SESSION.SET_CONTEXT ( c_context, username, My_USER); 
END; 
        END myschema6_pkg; 
            / 

--创建触发器 登录数据库后创建或替换触发器 myschema6_ctx_trig 宣布 My_USER VARCHAR2(30); v_code VARCHAR2(30); v_errm VARCHAR2(30); 开始 myschema.myschema6_pkg.set_contexts; SELECT SYS_CONTEXT ('USERENV', 'OS_USER') into My_USER FROM DUAL; 例外 当其他人 v_code := SQLCODE; v_errm := SUBSTR(SQLERRM, 1 , 64);

               -- to insert information about errors.
            INSERT INTO myschema.errors(user_name,error_code,error_message,error_time)
            VALUES(My_USER,v_code,v_errm, SYSTIMESTAMP);
END;

/

sql oracle plsql triggers
1个回答
0
投票

您不能使用“

AFTER LOGON ON DATABASE
”触发器来捕获登录失败。登录失败永远不会成功登录,因此这样的触发器永远不会被执行。

但是,您可以使用“

AFTER SERVERERROR ON DATABASE
”触发器捕获登录失败,每当向调用客户端引发 ORA 异常时,该触发器就会触发,并且将包括登录时的任何错误消息(密码无效、帐户锁定等) ..)。在触发器内,查看
server_error(1)
并主要查找
28000
1017
1005
的值(它们是正值,而不是负值)。请注意,对于登录失败,
USERNAME
中的
v$session
将为
NULL
。您必须通过查看
SYS_CONTEXT('USERENV','AUTHENTICATED_IDENTITY')
来获取所需的用户名。

最后,在任何用于写入日志的触发器中,您都希望将其设为自治事务并包含 COMMIT:

DECLARE
  PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
  INSERT ...

  COMMIT;
END;

但是,为了简单起见,我建议您首先尝试 Oracle 的标准登录审核。如果已启用,只需查询

DBA_AUDIT_TRAIL
即可了解登录失败情况:

SELECT *
  FROM dba_audit_trail
 WHERE action_name = 'LOGON'
   AND returncode <> 0

或者如果使用统一审核:

SELECT *
  FROM unified_audit_trail
 WHERE action_name = 'LOGON'
   AND return_code <> 0

仅当您确实需要审计无法提供的有关客户端的丰富信息时,才使用系统错误触发器。

© www.soinside.com 2019 - 2024. All rights reserved.