我正在尝试跟踪失败的用户登录 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;
/
您不能使用“
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
仅当您确实需要审计无法提供的有关客户端的丰富信息时,才使用系统错误触发器。