【发布时间】:2016-04-29 08:23:51
【问题描述】:
当我在我的 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'
基本上,我正在创建一个管理棋盘游戏联盟的学术项目。所以有一个游戏桌和一个联赛桌。还有一个 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 中删除条目时,会出现错误。这个触发器有什么问题?
【问题讨论】:
-
有两种方法可以解决这个问题 - 使用语句触发器或使用复合触发器,在这两种方法中复合触发器可能具有更好的性能。有关使用复合触发器的示例,请参阅我对 this question 的回答。祝你好运。