Обновление внешнего ключа при обновлении первичного ключа - PullRequest
0 голосов
/ 29 января 2019

у меня есть 3 таблицы:

table1

A1 primary key
issue

table2

B1 primary key
issue
BA1 references table1 A1

table3

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

1 Ответ

0 голосов
/ 29 января 2019

Если в Oracle нет on update cascade, то на это есть веская причина.
Дополнительная информация здесь .

Правильный дизайн для обработки такого случая - определитьотдельное поле в качестве суррогатного ключа.Это не должен быть «естественный ключ» (= то, что выглядит уникальным, но в конечном итоге изменяется. Хорошим примером естественного ключа, который не следует использовать в качестве первичного ключа, может быть номер паспорта человека).

Попробуйте обновить схему, добавив 1 столбец первичного ключа, например, с номерами, сгенерированными идентификатором.
Как только это будет сделано, триггер вам не понадобится.

Редактировать : Чтобы выделить обсуждение ниже.Важным моментом в опубликованной мной ссылке является то, что использование триггера для этого случая может привести к неопределенному поведению.
Тип запроса, который вызовет неопределенное поведение, встречается не так часто, но если это когда-либо произойдет, это приведет кв ситуации, которая почти невозможна для отладки.

...