2015-02-24 25 views
0

这是投掷“错误:ORA-04082:新的或旧的引用在表级别不允许触发”SQL抬起应用程序错误触发

我不知道我要去哪里错了。错误编号应该没有区别吗?

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; 

回答

2

由于错误提示,你只能引用新的和旧的伪行的行级触发器,而不是表级触发器,不管有多少行受到了其触发一次声明。如果用不同的饮水器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; 
/

不能提交或从触发器中回退;这取决于插入/更新的事务来决定是否这样做。

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

+0

好吧,这是有道理的,但这段代码产生了额外的错误 – 2015-02-24 17:06:07

+0

@KyleGoodwin - 什么错误?看起来有点奇怪,有一些drinkerid和person列似乎预计会有相同的值,所以列名可能是错误的,但是您没有显示DDL表,因此无法分辨。否则,你需要说出你得到了什么错误。 – 2015-02-24 17:09:04