更新主键时更新外键

时间:2019-01-29 14:41:22

标签: sql oracle oracle12c database-trigger

我有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.A1BA1自动更新 与更新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

触发时

1 个答案:

答案 0 :(得分:1)

如果Oracle上没有on update cascade,则有充分的理由。
更多信息here

处理这种情况的正确设计是将一个单独的字段定义为代理键。它不能是“自然钥匙”(=看起来很独特但最终会改变的东西。自然钥匙的一个很好的例子(不用作主钥匙)是一个人的护照号码)。

尝试更新您的架构以添加1个主键列,其中包含由身份生成的数字。例如
完成此操作后,您将不需要触发器。

编辑:突出显示以下讨论。我发布的链接中的重要一点是,在这种情况下使用触发器会导致未定义的行为。
触发未定义行为的查询类型并不常见,但是一旦发生,将导致几乎无法调试的情况。