3

トリガーを作成しています:

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

私は同じ問題を抱えている他の人と一緒にかなりの数の投稿を読みましたが、まだ解決策を見つけていません、何かアイデアはありますか?

4

2 に答える 2

4

これがコンパイルに失敗する実際の理由は2つあります。

  1. 新しい値をとして参照する必要があります:newrow
  2. の前に、キャリッジリターンやラインフィードが必要です/

ただし、このトリガーは機能しません。変更するテーブルの例外が発生ORA-04091: table name is mutating, trigger/function may not see it.します。これは、更新するテーブルを行レベルのトリガーで参照しているためです。簡単に言えば、Oracleはデータの読み取り一貫性のあるビューを保証します。

トリガーでは、を更新している最中ですCollectionitems。このテーブルから同時に、同じセッションで選択すると、2つの可能な状態があります。更新され、更新されていません。ビューの読み取り整合性を確保するために、Oracleはこのエラーを発生させます。

特定のケースでは、トリガーではなくマテリアライズドビューを検討することをお勧めします。

参考文献:

于 2012-05-06T16:34:18.710 に答える
0

トリガー/の最後に、それ自体への行を配置します。

于 2012-05-06T15:29:31.213 に答える