【问题标题】:maximum number of recursive SQL levels递归 SQL 级别的最大数量
【发布时间】:2012-03-30 23:24:08
【问题描述】:
    java.sql.SQLException: ORA-00036: maximum number of recursive SQL levels (50) exceeded ORA-06512: at "EPOLICIA.EMER_COMPLAINT_VALIDATE", 
line 5 ORA-04088: error during execution of trigger 'EPOLICIA.EMER_COMPLAINT_VALIDATE' ORA-06512: at "EPOLICIA.EMER_COMPLAINT_VALIDATE", 
line 5 ORA-04088: error during execution of trigger 'EPOLICIA.EMER_COMPLAINT_VALIDATE' ORA-06512: at "EPOLICIA.EMER_COMPLAINT_VALIDATE", 
line 5 ORA-04088: error during execution of trigger 'EPOLICIA.EMER_COMPLAINT_VALIDATE' ORA-06512: at "EPOLICIA.EMER_COMPLAINT_VALIDATE", 
line 5 ORA-04088: error during execution of trigger 'EPOLICIA.EMER_COMPLAINT_VALIDATE' ORA-06512: at "EPOLICIA.EMER_COMPLAINT_VALIDATE", 
line 5 ORA-04088: error during execution of trigger 'EPOLICIA.EMER_COMPLAINT_VALIDATE' ORA-06512: at "EPOLICIA.EMER_COMPLAINT_VALIDATE", 
line 5 ORA-04088: error during execution of trigger 'EPOLICIA.EMER_COMPLAINT_VALIDATE' ORA-06512: at "EPOLICIA.EMER_COMPLAINT_VALIDATE", 
line 5 ORA-04088: error during execution of trigger 'EPOLICIA.EMER_COMPLAINT_VALIDATE' ORA-06512: at "EPOLICIA.EMER_COMPLAINT_VALIDATE", 
line 5 ORA-04088: error during execution of trigger 'EPOLICIA.EMER_COMPLAINT_VALIDATE' ORA-06512: at "EPOLICIA.EMER_COMPLAINT_VALIDATE", 
line 5 ORA-04088: error during execution of trigger 'EPOLICIA.EMER_COMPLAINT_VALIDATE' ORA-06512: at "EPOLICIA.EMER_COMPLAINT_VALIDATE", 
line 5 ORA-04088: error during execution of trigger 'EPOLICIA.EMER_COMPLAINT_VALIDATE' ORA-06512: at "EPOLICIA.EMER_COMPLAINT_VALIDATE", 
line 5 ORA-04088: error during execution of trigger 'EPOLICIA.EMER_COMPLAINT_VALIDATE' ORA-06512: at "EPOLICIA.EMER_COMPLAINT_VALIDATE", 
line 5 ORA-04088: error during execution of trigger 'EPOLICIA.EMER_COMPLAINT_VALIDATE' ORA-06512: at "EPOLICIA.EMER_COMPLAINT_VALIDATE", 
line 5 ORA-04088: error during execution of trigger 'EPOLICIA.EMER_COMPLAINT_VALIDATE' ORA-06512: at "EPOLICIA.EMER_COMPLAINT_VALIDATE", 
line 5 ORA-04088: error during execution of trigger 'EPOLICIA.EMER_COMPLAINT_VALIDATE' ORA-06512: at "EPOLICIA.EMER_COMPLAINT_VALIDATE", 
line 5 ORA-04

我创建了一个触发器,通过它我将限制用户在一天内只接受来自特定 IP 地址的一个投诉

EMER_COMPLAINT_VALIDATE

create or replace trigger emer_complaint_validate before insert on emer_complaint for each row
begin
if(((:new.date_time) = (:old.date_time)) AND ((:new.ip_add) = (:old.ip_add))) then
RAISE_APPLICATION_ERROR(-20001, 'Only one complaint accepted !!'); 
ELSE
insert into emer_complaint values(:new.case_id,:new.complaint,:new.land_mark,:new.station_id,:new.date_time,:new.ip_add,:new.status);
end if;
end;
/

应用了触发器的表结构

【问题讨论】:

    标签: oracle triggers


    【解决方案1】:

    您需要的是约束,而不是触发器。在 11g 中:

    ALTER TABLE emer_complaint 
       ADD (date_complaint DATE GENERATED ALWAYS AS (trunc(date_time)));
    
    ALTER TABLE emer_complaint 
       ADD CONSTRAINT "one complaint per day" UNIQUE (ip_add, date_complaint);
    

    在 10g 及之前:

    CREATE UNIQUE INDEX "one complaint per day" 
       ON emer_complaint (ip_add, trunc(date_time));
    

    Don't use triggers for (cross-row) integrity.

    【讨论】:

    • 感谢您的建议。因此,它将根据日期或时间戳进行检查。因为,每一刻都是独一无二的。所以,我只需要基于日期进行比较。所以,它会满足我的要求..??
    • 我在这两种情况下都使用了trunc(date_time)。这将选择不带时间组件的日期(因此每个 ip 每天一个投诉)。
    • +1 这是唯一正确的方法。人们什么时候会知道触发器不利于加强关系完整性?
    • 我尝试了多次投票。幸运的是,我在向上三角形点击了奇数次后停下来。正如 APC 所说,“唯一正确的方法”并且比我能提供的价值更多。
    猜你喜欢
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 2020-05-28
    • 2018-08-16
    • 2012-04-26
    • 2013-03-24
    相关资源
    最近更新 更多