我想使用raise_application_error-procedure来停止登录过程。 我写了一个触发器,检查TERMINAL字符串,如果它是正确的(我知道这不是真正的安全,但首先,它就足够了) 所以触发器工作正常并做我想要的,但raise_application_error导致回滚并且不发送我想要的异常。当我使用我的应用程序登录数据库时,raise_application_error不会停止应用程序。 第一个问题:这是正确的方法,停止使用错误的应用程序登录数据库? 第二个问题:如果是,那有什么不对?
create or replace
TRIGGER after_logon_on_database
AFTER LOGON ON DATABASE
BEGIN
IF sys_context('USERENV', 'TERMINAL')='IAS' THEN
INSERT INTO event_log
(event_date, event_time, username, event_case, event_comment)
VALUES
(SYSDATE, to_char(sysdate, 'hh24:mi:ss'), USER, 'LOGON-SUCCESS', sys_context('USERENV', 'TERMINAL'));
ELSE
INSERT INTO event_log
(event_date, event_time, username, event_case, event_comment)
VALUES
(SYSDATE, to_char(sysdate, 'hh24:mi:ss'), USER, 'LOGON-FAILURE', sys_context('USERENV', 'TERMINAL'));
RAISE_APPLICATION_ERROR(-20001, 'Access denied!');
END IF;
END after_logon_on_database;
答案 0 :(得分:1)
答案 1 :(得分:0)
在IF / ELSE的第二部分添加一个提交;插入和提升之间的陈述。这将确保正确地将登录失败消息插入数据库。
您知道如果登录触发器是DBA(具有DAB角色),则登录触发器不会阻止用户登录。这是一项功能,可确保某人始终可以访问数据库以修复损坏的登录触发器。
您也是正确的,因为触发器不会引发(作为Oracle返回的第一条错误消息)错误-20001。它将返回-604(ORA-00604:在递归SQL级别1发生错误)。您没有在登录时直接执行触发器,只需删除几步即可执行。您将希望您的应用程序正确处理此错误。