【问题标题】:"Error: ORA-04098: trigger 'CA0513.ITEMAVGRATINGTRIGGER' is invalid and failed re-validation"“错误:ORA-04098:触发器‘CA0513.ITEMAVGRATINGTRIGGER’无效并且重新验证失败”
【发布时间】:2012-05-15 08:16:48
【问题描述】:

我正在创建一个触发器:

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 中的一行来运行触发器时,我都会得到 squirrel 的返回:

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

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

【问题讨论】:

  • 这永远行不通。你最终会得到一个变异表异常。你的实际问题是双重的。您应该将新值引用为:newrow.,并且在“/”之前确实需要回车/换行。
  • 感谢您的回复,我已经重新创建了变异表异常,请您解释一下为什么会这样?

标签: sql oracle triggers squirrel-sql


【解决方案1】:

编译失败的真正原因是双重的。

  1. 您应该将新值引用为:newrow
  2. / 之前确实需要回车和/或换行。

但是,这个触发器永远不会起作用。您最终会遇到一个变异表异常,ORA-04091: table name is mutating, trigger/function may not see it. 这是因为您在行级触发器中引用要更新的表。简而言之,Oracle 确保数据的读取一致视图。

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

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

延伸阅读:

【讨论】:

    【解决方案2】:

    / 放在触发器的末尾,与自身成一行。

    【讨论】:

    • 您在单独的行上使用/ 重新创建了触发器,但它仍然给您这个错误?您是否在 CA0513 架构中创建触发器?
    • SHOW ERRORS TRIGGER CA0513.ITEMAVGRATINGTRIGGER 呢?
    • 返回“错误:ORA-00900:无效的 SQL 语句”
    • 啊,那是因为SHOW ERRORS 特定于 SQL*Plus,但您使用的是 Squirrel。对不起。无论如何,如果您重现了 table-mutating 错误,那么我猜您一定已经摆脱了“invalid trigger”错误消息。
    • 那会解释它,谢谢,是的,它已经消失了,但现在我们不确定它为什么会产生那个异常!
    猜你喜欢
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多