这引发了“错误: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;
答案 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;
/
您无法在触发器内提交或回滚;它由进行插入/更新的事务决定是否这样做。
但是,您也无法从同一个表格中选择插入/更新;你会从中得到一个变异表错误,至少如果你试图一次插入/更新多行。