对于学校项目,我们被迫拥有冗余信息并使用触发器对其进行更新。我们有一个名为“recipe_ratings”的表,其中包含一个“评级”(数字 0-100)。在我们的“食谱”表中,我们有一个名为“评级”的冗余行,其中包含该特定食谱的平均评级。
我们尝试像这样创建一个 Oracle 触发器:
CREATE OR REPLACE TRIGGER trigger_rating
AFTER UPDATE
ON recipe_ratings
FOR EACH ROW
DECLARE
average_rating NUMBER;
BEGIN
SELECT ROUND(AVG(rating))
INTO average_rating
FROM recipe_ratings
WHERE rid = :new.rid;
UPDATE recipe SET rating = average_rating
WHERE rid = :new.rid
END;
但这给了我们:ORA-04091:表名正在变化,触发器/函数可能看不到它。我们正在试验“自主交易”,但感觉就像我们正在远离我们的触发器。
我们怎样才能使这个触发器起作用?