帮助,我是oracle触发器的新手。 我想要做的是当删除C的最后一行B时,A不应该有B. 所以我在C上创建了一个触发器。
CREATE OR REPLACE TRIGGER child_check
BEFORE DELETE DELETE ON C
REFERENCING OLD as OLD
FOR EACH ROW DECLARE
rowcnt number;
rowcnt1 number;
BEGIN
SELECT COUNT(*) INTO rowcnt FROM C WHERE colB = :OLD.colB;
IF rowcnt > 1 THEN
DBMS_OUTPUT.PUT_LINE('DELETE');
DELETE C WHERE ROWID = :OLD.ROWID;
ELSE
SELECT COUNT(*) INTO rowcnt1 FROM A WHERE colB = :OLD.colB;
IF rowcnt1 > 1 THEN
DBMS_OUTPUT.PUT_LINE('B IS USED IN A. C CANNOT REMOVE ALL OF B');
ELSE
DBMS_OUTPUT.PUT_LINE('DELETE');
DELETE C WHERE ROWID = :OLD.ROWID;
DELETE B WHERE colB = :OLD.colB;
END IF;
END IF;
END; /
TABLE A | TABLE B | TABLE C
colA | colB | colB | colC | colB
A.colA是PK B.colB是PK C.colC是PK
B.colB的A.colB FK B.colB的C.colB FK
有一个变异错误。 我做谷歌搜索,我知道有一些与删除有关。我找不到具体的解决方案 有人可以告诉我删除查询中的更改方式和内容吗?
答案 0 :(得分:1)
在Oracle中,您无法在行级别触发器打开的表上执行选择,插入,更新或删除操作。在您的情况下,触发器在C上,因此您不能从C中删除记录。
你的触发器似乎有点奇怪。从C中删除记录时触发器触发。然后触发器也从C中删除该记录。这不是必需的。该记录将被删除。
可以从B中删除。
您的代码很难理解。 B是C中的列,但也是表的名称?非常混乱。
答案 1 :(得分:0)
除了Mutating Trigger
错误之外,这还可能导致触发器以递归方式执行并失败,因为Delete
中的c
(trigger
}语句将启动其他trigger
这种情况反复发生。