我用的是Oracle数据库。
现在有两个表,tabel1 和 tabel2
其中tabel1的ID是主键,tabel2的parid是外建关联tabel1的主键。
我想在删除tabel1前删掉tabel2里面的相关内容。
想通过触发器实现。自己做了一个触发器,如下:
(数据库名叫ora)CREATE OR REPLACE TRIGGER trig1
BEFORE DELETE
ON ora.tabel1
FOR EACH ROW
DECLARE
tmpVar NUMBER;BEGIN
   tmpVar := 0;   DELETE FROM tabel2 WHERE tabel2.parid=:OLD.ID;END ;
/
触发器可以顺利的创建
但是在执行语句
delete from tabel1 where id = 1
时报出异常:
ORA-04091: 表 ora.tabel2 发生了变化,触发器/函数不能读请问该怎么解决?

解决方案 »

  1.   

    可以在建立外键时使用on delete cascadeALTER TABLE table2 ADD CONSTRAINT fk_t_parid FOREIGN KEY(parid) REFERENCES table1(ID) ON DELETE CASCADE;
      

  2.   

    这2个表应该不是你建立的吧?
    如果有外键,级联删除可以不用触发器解决。--建立Foreign   key   constraint的之后指定on   delete   cascade   
        
      alter   table   <table_name>   add   constraint   <constraint_name>   foreign   key   on   (<columns>)   references   <parent_table>(<columns>)     
      on   delete   cascade     你出现上面错误的原因是,可能原先的建表者已经通过外键实行级联删除了。
      

  3.   

    删掉你的触发器,执行delete from tabel1 where id = 1 
    看一看
      

  4.   

    你的这个trigger没有问题,可以执行的,也可以完成你的预期的内容.
    但是,如果你行trigger中显式引用了tabel1表就会报04091错误.不过你的这个trigger完全可以不用,简单的通过on delete cascade限制实现.
    参考如下:
    CREATE TABLE table1 (ID INT PRIMARY KEY,b INT);
    CREATE TABLE table2 (ID INT PRIMARY KEY,parid INT REFERENCES table1(ID) ON DELETE CASCADE);
    INSERT INTO table1 VALUES(1,1);
    INSERT INTO table1 VALUES(2,2);
    INSERT INTO table1 VALUES(3,3);
    INSERT INTO table2 VALUES(1,1);
    INSERT INTO table2 VALUES(2,2);
    INSERT INTO table2 VALUES(3,3);
    COMMIT;DELETE FROM table1 WHERE ID=1;
    SELECT * FROM table2;
    commit;
      

  5.   

    触发器是先判断table1有没有外键约束?如果有外键约束,你要做删除已经违反了规则,就不允许删除操作在table2发生;判断外键的优先级比删除table2的优先更高
      

  6.   


    ALTER TABLE table2 ADD CONSTRAINT fk_t_parid FOREIGN KEY(parid) REFERENCES table1(ID) ON DELETE CASCADE;
    要是如果有三个表。tabel3和tabel2也有这种主外键的关系。
    那么在删除tabel1时可以将tabel3里的相关内容也删除吗?
      

  7.   

    在Toad离修改表时为什么ON DELETE CASCADE选项是不能选的?
      

  8.   

    问一下如果表已经有外键ON DELETE CASCADE选项时在加触发器会有错误?
      

  9.   

    也就是说可能你的table2里的ID被别人引用了?