Oracle SP 和触发器仅成功运行一次

Posted

技术标签:

【中文标题】Oracle SP 和触发器仅成功运行一次【英文标题】:Oracle SP and Trigger only run Successfully once 【发布时间】:2013-10-11 00:44:56 【问题描述】:

如果数据库发现 3 次登录失败,我需要编写一个触发器和/或 SP 来删除表中的所有行。奇怪的是,当我运行它时,触发器每次都会触发,SP 也是如此,但是,SP 只会在我第一次登录失败 3 次时删除记录。所以,如果我登录失败 3 次,触发器调用 sp 并删除记录,但如果我向表中添加另一条记录,并且再次登录失败,它不会删除记录,除非我重新编译 SP 和运行另一个失败的登录。

目前我有这个作为触发器

create or replace 
TRIGGER TRIG_Failed_Login
after servererror on database

BEGIN
      If (ORA_IS_SERVERERROR(1017)) Then       
          insert into ERRORTRAP (errormessage, message_timestamp) VALUES ('Failed Login - 1017', current_timestamp);      
          commit;
          BEGIN
            sp_trucate_keystore();
          END;  
      END IF;    
End;

这是一个 SP:

create or replace 
PROCEDURE sp_Trucate_KeyStore is

    RECORD_COUNT NUMBER;
    begin        
         SELECT COUNT(*) INTO RECORD_COUNT FROM ERRORTRAP;   
         BEGIN  
             IF RECORD_COUNT >= 3 THEN 
             INSERT INTO errortrap (errormessage) VALUES ('this is a test');
                 DELETE FROM KEYSTORE;
                 COMMIT;
             END IF; 
         END;
    END;

感谢任何帮助。

【问题讨论】:

我应该注意到SP中的插入也每次都运行,只是从密钥库中删除只运行第一次 DELETE FROM KEYSTORE 是否会删除表中的所有对象,包括触发器? 【参考方案1】:

如何将行重新插入到 KEYSTORE 表中?您是否通过单独的会话手动插入这些,在您下次登录尝试失败之前提交?让我想起了这个帖子里的cmets:Oracle stored procedure needs recompilation to fetch table data

【讨论】:

以上是关于Oracle SP 和触发器仅成功运行一次的主要内容,如果未能解决你的问题,请参考以下文章

在多节点环境中仅触发一次调度作业

oracle 学习笔记之触发器

Apollo 客户端解析器仅触发一次

oracle 存储过程与触发器

对于手动编辑的文件,inotify IN_CLOSE_WRITE 仅触发一次

Oracle PL / SQL触发器,在UPDATE之前/之后仅用于识别表中已修改的列