Подтвердить что ты не робот

MS SQL "ON DELETE CASCADE" несколько внешних ключей, указывающих на одну и ту же таблицу?

Хауди, У меня проблема, когда мне нужен каскад на нескольких внешних ключах, указывающих на одну и ту же таблицу.

[Insights]
| ID | Title        |
| 1  | Monty Python |
| 2  | Spamalot     | 

[BroaderInsights_Insights]
| broaderinsight_id | insight_id |
| 1                 | 2          |

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

Я пробовал это:

 CREATE TABLE broader_insights_insights(id INT NOT NULL IDENTITY(1,1),
   broader_insight_id INT NOT NULL REFERENCES insights(id) ON DELETE CASCADE,
   insight_id INT NOT NULL REFERENCES insights(id) ON DELETE CASCADE,
   PRIMARY KEY(id))
Go

Это приводит к предупреждению о том, что каскад "может вызывать циклы или несколько каскадных путей"

Итак, я попытался добавить каскад только к insight_id, и это приводит к:

"Операция DELETE противоречила ограничению REFERENCE"

Любые идеи?

Спасибо

Daniel

4b9b3361

Ответ 1

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

create trigger T_Insights_D
on Insights
instead of delete
as
    set nocount on
    delete from broader_insights_insights
    where insight_id in (select ID from deleted) or
    broader_insight_id in (select ID from deleted)

    delete from Insights where ID in (select ID from deleted)

Часто с каскадным удалением и большим количеством внешних ключей вам нужно потратить время на разработку "каскадного" порядка, чтобы удаление, которое происходит в верхней части "дерева", успешно каскадировалось для привязки таблиц. Но в этом случае это невозможно.