表正在变异。触发器可能看不到它(即使在不同的表上)

时间:2018-01-06 17:30:12

标签: database oracle plsql triggers

我有两个表:GroupScheduleGroup表由列组成:Group_Name,No_of_member。 Schedule表由列组成:Group_Name,Schedule_Date。 一个组可以有很多时间表。

我正在尝试创建一个触发器,当从Schedule表中删除特定记录时,该触发器会删除Group表中的所有相应记录。我写了一个触发器:

CREATE OR REPLACE TRIGGER group_test
AFTER DELETE ON Group
FOR EACH ROW
BEGIN
  DELETE FROM Schedule WHERE Schedule.group_name = :old.group_name;
END;

但是当我尝试使用命令DELETE FROM Group WHERE group_name = 'AwesomeGroup';从组表中删除记录时,Oracle显示:

  

Table is mutating, trigger/function may not see it.

     

at line 2, error during execution of trigger 'group_test'

如果我试图从我创建触发器的同一个表中删除一条记录(在本例中是Group),这是有意义的,但是我在Group表上有触发器而我是试图删除Schedule表上的记录。那么,为什么oracle继续给我这个错误?

1 个答案:

答案 0 :(得分:0)

您收到此错误是因为您在列ON DELETE CASCADE上的外键上有Schedulegroup_name子句。

当然,当您在表DELETE上执行Group时,Oracle会自动跟随外键并删除Schedule中的记录,这会使表更改。

这是导致您的触发器group_test功能失调的原因。事实上,这个触发器与ON DELETE CASCADE子句是多余的。我同意@WernfriedDomscheit,您必须在两种解决方案之一中进行选择。