SQL提升应用程序错误触发器

时间:2015-02-24 16:55:47

标签: sql oracle triggers raiseerror

这引发了“错误: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;

1 个答案:

答案 0 :(得分:3)

正如错误所示,您只能引用行级触发器中的新旧伪行,而不是表级触发器,无论该语句影响了多少行,它都会触发一次。如果您使用不同的饮酒者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;
/

您无法在触发器内提交或回滚;它由进行插入/更新的事务决定是否这样做。

但是,您也无法从同一个表格中选择插入/更新;你会从中得到一个变异表错误,至少如果你试图一次插入/更新多行。