“错误:ORA-04098:触发'CA0513.ITEMAVGRATINGTRIGGER'无效且重新验证失败”

时间:2012-05-06 15:15:50

标签: sql oracle triggers squirrel-sql

我正在创建一个触发器:

CREATE OR REPLACE TRIGGER ItemAvgRatingTrigger
AFTER INSERT OR UPDATE OF rating ON Collectionitems
REFERENCING NEW AS newRow
FOR EACH ROW
BEGIN
    UPDATE Item
    SET rating = (SELECT AVG(Collectionitems.rating) FROM Collectionitems, Item WHERE
        Collectionitems.itemid = newRow.itemid AND newRow.itemid = Item.itemid)
    WHERE Item.itemid = newRow.itemid;
END ItemAvgRatingTrigger;/

当我通过更新Collectionitems中的行来运行触发器时,我得到松鼠返回:

Error: ORA-04098: trigger 'CA0513.ITEMAVGRATINGTRIGGER' is invalid and failed re-validation

SQLState:  42000
ErrorCode: 4098
Position: 7

执行SQL语句:

SELECT * FROM User_Errors;

生成1个错误:

PLS-00103: Encountered the symbol "/" The symbol "/" was ignored./n

我已经阅读过很多帖子,其他人遇到同样的问题,但还没有找到解决方案,还有什么想法?

2 个答案:

答案 0 :(得分:4)

无法编译的实际原因是双重的。

  1. 您应该将新值引用为:newrow
  2. 您需要在/之前提交回车和/或换行。
  3. 然而,这个触发器永远不会起作用。您将最终得到一个变异表异常,ORA-04091: table name is mutating, trigger/function may not see it.这是因为您在行级触发器中引用了您正在更新的表。简单地说,Oracle确保了数据的读一致视图。

    在触发器中,您正在更新Collectionitems。同时从该表中选择,在同一会话中,有两种可能的状态;更新但未更新。为了确保您的视图是读取一致的,Oracle会引发此错误。

    在您的特定情况下,您可能需要考虑materialized view而不是触发器。

    进一步阅读:

答案 1 :(得分:0)

将触发器末尾的/放在一条线上。