我有两个表:Group
和Schedule
。
Group
表由列组成: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继续给我这个错误?
答案 0 :(得分:0)
您收到此错误是因为您在列ON DELETE CASCADE
上的外键上有Schedule
个group_name
子句。
当然,当您在表DELETE
上执行Group
时,Oracle会自动跟随外键并删除Schedule
中的记录,这会使表更改。
这是导致您的触发器group_test
功能失调的原因。事实上,这个触发器与ON DELETE CASCADE
子句是多余的。我同意@WernfriedDomscheit,您必须在两种解决方案之一中进行选择。