这个问题在这里已有答案:
当我在Oracle数据库项目中声明一个触发器时,我收到一个错误,其中说:
ERROR at line 1:
ORA-04091: table MIHAL277.LEAGUE_GAMES is mutating, trigger/function may not
see it
ORA-06512: at "MIHAL277.DELETE_UNUSED_GAME", line 4
ORA-04088: error during execution of trigger 'MB358996.DELETE_UNUSED_GAME'
基本上我正在创建一个管理桌游联赛的学术项目 . 所以有一个Game表和一个League表 . 还有一个League_Games表,表明联盟中是否有游戏可用(即联盟中的玩家是否玩这个游戏) . 联盟可以决定停止“拥有”一个游戏,然后将其从League_Games表中删除 . 但是当它发生时,我想运行一个触发器,检查是否仍有一些联赛使用该游戏,如果没有 - 从游戏桌中删除特定游戏的条目 .
我的触发器是这样的:
CREATE OR REPLACE TRIGGER delete_unused_game
BEFORE DELETE ON League_Games
FOR EACH ROW
DECLARE
deleted_game_count integer;
BEGIN
SELECT COUNT(*)
INTO deleted_game_count
FROM League_Games
WHERE Game_ID = :OLD.Game_ID;
IF deleted_game_count = 0 THEN
DELETE FROM Game
WHERE ID = :OLD.Game_ID;
END IF;
END;
/
因此,当我从Leage_Games中删除条目时,会出现错误 . 这个触发器出了什么问题?
1 回答
您正在尝试查询正在更新的同一个表中的数据(在这种情况下,删除...) . 你不能这样做,因为它是“变异”
阅读更多变异触发器.Tom Kyte在这里提供了一个很好的步骤:
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:290416059674
以及另一篇关于“触发器的问题”的博客文章:
http://www.oracle.com/technetwork/testcontent/o58asktom-101055.html
基本上,你应该重新审视你的逻辑,并考虑不使用触发器这样做;)