【问题标题】:SQL Raise Application Error TriggerSQL 引发应用程序错误触发器
【发布时间】:2015-04-26 10:10:37
【问题描述】:

这会抛出“错误:ORA-04082:表级触发器中不允许新或旧引用”

我不确定我哪里出错了。错误号应该不会有影响吧?

    CREATE OR REPLACE TRIGGER REJECTION 
BEFORE INSERT OR UPDATE ON TEA_PREFS_T 
DECLARE temp NUMBER;
BEGIN
  SELECT COUNT(*) INTO temp FROM tea_prefs_t WHERE person = :new.drinkerid;
  IF (temp >=10) THEN
    raise_application_error(-20101, 'ERROR: CANNOT INSERT MORE THAN 10');
    ROLLBACK;
  END IF;
END;

【问题讨论】:

    标签: sql oracle triggers raiseerror


    【解决方案1】:

    正如错误提示的那样,您只能在行级触发器中引用新旧伪行,而不是表级触发器,无论语句影响多少行,表级触发器都会触发一次。如果您使用不同的饮酒者 ID 更新了两行,触发器将使用哪个值进行查找?

    要使其成为行级触发器,请添加FOR EACH ROW

    CREATE OR REPLACE TRIGGER REJECTION 
    BEFORE INSERT OR UPDATE ON TEA_PREFS_T 
    FOR EACH ROW
    DECLARE
      temp NUMBER;
    BEGIN
      SELECT COUNT(*) INTO temp FROM tea_prefs_t WHERE person = :new.drinkerid;
      IF (temp >=10) THEN
        raise_application_error(-20101, 'ERROR: CANNOT INSERT MORE THAN 10');
      END IF;
    END;
    /
    

    您不能在触发器内提交或回滚;由执行插入/更新的事务来决定是否这样做。

    但是,您也不能从要插入/更新的同一个表中进行选择;至少在您尝试一次插入/更新多行时,您会因此得到一个变异表错误。

    【讨论】:

    • 好吧,这是有道理的,但是这段代码产生了一个额外的错误
    • @KyleGoodwin - 什么错误?似乎有点奇怪,饮酒者和人员列似乎应该具有相同的值,所以列名可能是错误的,但您没有显示 DDL 表,所以无法分辨。否则你需要说出你遇到了什么错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 2010-10-10
    • 2012-04-27
    相关资源
    最近更新 更多