Oracle触发器中的变异错误

时间:2015-02-25 06:26:28

标签: oracle

帮助,我是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

有一个变异错误。 我做谷歌搜索,我知道有一些与删除有关。我找不到具体的解决方案 有人可以告诉我删除查询中的更改方式和内容吗?

2 个答案:

答案 0 :(得分:1)

在Oracle中,您无法在行级别触发器打开的表上执行选择,插入,更新或删除操作。在您的情况下,触发器在C上,因此您不能从C中删除记录。

你的触发器似乎有点奇怪。从C中删除记录时触发器触发。然后触发器也从C中删除该记录。这不是必需的。该记录将被删除。

可以从B中删除。

您的代码很难理解。 B是C中的列,但也是表的名称?非常混乱。

答案 1 :(得分:0)

除了Mutating Trigger错误之外,这还可能导致触发器以递归方式执行并失败,因为Delete中的ctrigger}语句将启动其他trigger这种情况反复发生。