我用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自动生成的,没改过
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自动生成的,没改过
不可以读取或者修改约束表的primary列
如果不然,你就写一个包,一个(before)语句级触发器和一个(after)行级触发器来实现
语句级触发器吧B中F2的内容写进一个全局变量(用包实现,pl/sql表),行级触发器来实现判断
的逻辑:if
...
where
....
end if还有就是句子后面加了"and",编译根本通不过结账