我用erwin建了两个表A( F1(pk), F2 ) 和 B( F2(pk),F3 ),其中B表通过F2字段和A表有一个
null allows的non-identifying relationship,也就是说A表的F2或者在B中存在,或者为null.
erwin生成oracle表A、B和触发器TI_A、TU_A.
TI_A是当向A表insert后触发的逐行触发器
TU_A是从A表update后触发的逐行触发器
这两个触发器的内容一样,就是当添加或修改后,判断新的F2是否在B表中存在,如果不存在,
就将A表的F2设置为NULL.DECLARE numrows INTEGER;
begin
    update A
      set
        A.F2 = NULL
      where
        not exists (
          select * from B
            where
              :new.F2 = B.F2
        )
        ;
end;但出现“表变异,触发器/函数不能读”的错误,如何解决?
触发器是erwin自动生成的,没改过

解决方案 »

  1.   

    表B是约束表
    不可以读取或者修改约束表的primary列
      

  2.   

    既然你写了这个触发器了,去掉那个约束吧,反正功能一样
    如果不然,你就写一个包,一个(before)语句级触发器和一个(after)行级触发器来实现
    语句级触发器吧B中F2的内容写进一个全局变量(用包实现,pl/sql表),行级触发器来实现判断
      

  3.   

    谢谢各位问答,erwin生成的trigger看来有很多问题,它竟然在trigger里生成这样
    的逻辑:if
       ...
       where
        ....
    end if还有就是句子后面加了"and",编译根本通不过结账