我有3张桌子:
表1
A1 primary key
issue
表2
B1 primary key
issue
BA1 references table1 A1
表3
C3 primary key
issue
CB1 references table 2 B1
我要更新TABLE1.A1
和BA1
自动更新
与更新CB1
TABLE2.B1
相同
我创建一个触发器:
TABLE1
的此触发器
create or replace tigger 1_trg
after update A1 on TABLE1
begin
update TABLE2
set BA1 := new.A1
where BA1:= old.A1
end;/
和这个TABLE2
create or replace tigger 2_trg
after update B1 on TABLE2
begin
update TABLE3
set CB1:= new.B1
where CB1:= old.B1
end;/
但是它不起作用,因为当1_trg
触发与他2_trg
答案 0 :(得分:1)
如果Oracle上没有on update cascade
,则有充分的理由。
更多信息here。
处理这种情况的正确设计是将一个单独的字段定义为代理键。它不能是“自然钥匙”(=看起来很独特但最终会改变的东西。自然钥匙的一个很好的例子(不用作主钥匙)是一个人的护照号码)。
尝试更新您的架构以添加1个主键列,其中包含由身份生成的数字。例如
完成此操作后,您将不需要触发器。
编辑:突出显示以下讨论。我发布的链接中的重要一点是,在这种情况下使用触发器会导致未定义的行为。
触发未定义行为的查询类型并不常见,但是一旦发生,将导致几乎无法调试的情况。