Как мне создать триггер для имитации нескольких ON DELETE CASCADE? - PullRequest
0 голосов
/ 15 сентября 2011

У меня есть таблицы с внешними ключами следующим образом:

Table1A
|
|- Table2A3A

Table1B
|
|- Table2B
   |
   |- Table2A3A

(то есть Table2A3A ссылается на Table1A и Table2B, которая ссылается на Table1B.)

Я хочу создать триггер, чтобы при удалении чего-либо в таблицах Table1A, Table1B или Table2B то, что в Table2A3A ссылается на удаленную строку, также удалялось.

Я спрашиваю, потому что, если я пытаюсь добавить on delete cascade в SQL Server, он возвращает Introducing FOREIGN KEY constraint on table 'Table2A3A' may cause cycles or multiple cascade paths.

Каким будет код SQL для такого триггера?

EDIT:

Извините, я неправильно прочитал свои таблицы:

Table1A
|
|- Table2A3A
|
|- Table2B
   |
   |- Table2A3A

(то есть Table2A3A ссылается на Table1A и Table2B, которая ссылается на Table1A.)

1 Ответ

0 голосов
/ 15 сентября 2011

Нет ни причины, ни в теории отношений, ни в практике SQL, что каскадное удаление должно вызывать либо цикл, либо несколько каскадных путей в соответствии с вашей диаграммой .Возможно, вам следует опубликовать DDL для каждой из таблиц, чтобы мы могли видеть, что еще может происходить.

Вот что я написал в качестве теста для PostgreSQL.(Может спасти кого-нибудь еще.) Я могу вставлять и удалять каскадами.

create table Table1A (
  ta_id integer primary key
);

create table Table1B (
  tb_id integer primary key
);

create table Table2B (
  tb_id integer primary key references Table1B (tb_id) on delete cascade
);

create table Table2A3A (
  tb_id integer not null references Table2B (tb_id) on delete cascade,
  ta_id integer not null references Table1A (ta_id) on delete cascade,
  primary key (tb_id, ta_id)
);
...