1

这是抛出“错误: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;
4

1 回答 1

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;
/

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

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

于 2015-02-24T16:59:16.447 回答