Ответ 1
CASCADE DELETE в MSSQL Server может только каскадироваться в одну таблицу. Если в таблице измерений есть две таблицы с отношениями внешних ключей, вы можете только каскадировать удаление до одного из них. (Это делается для предотвращения удаления каскадирования через несколько путей и создания конфликтов, так как С++ допускает множественное наследование, но С# допускает только одно наследование)
Если это так, вы вынуждены использовать триггеры или специально обрабатывать регистр в своем коде.
По этой причине я видел, как многие люди выбирают триггеры во всех случаях. Даже когда есть только один внешний стол. Это обеспечивает согласованность, и поэтому люди знают, что нужно искать при ведении базы данных.
Если можно было бы каскадировать удаление до более чем одной таблицы, я бы сказал, что это будет наиболее предпочтительный вариант. Это ограничение, однако, загрязняет воды, и в настоящее время я больше склоняюсь к триггерам, владеющим всеми такими поведением. Накладные расходы при использовании триггеров для каскадных удалений и обновлений являются лишь незначительными с точки зрения кодирования, но допускают стандартные методы, которые являются действительно универсальными.
EDIT:
Возможно, вы захотите переместить "принятый ответ" кому-то другому, я разработал, что я ошибся выше.
У вас может быть несколько таблиц фактов, которые включены. УДАЛИТЬ CASCADE Внешние ключи для таблиц с таблицей.
То, что вы не можете сделать, - это иметь одну таблицу фактов, чтобы УДАЛИТЬ ограничения CASCADE для внешних ключей для нескольких таблиц измерений.
Итак, например...
- Таблица размеров [Лицо] (id INT IDENTITY,)
- Таблица размеров [Экзамен] (id INT IDENTITY,)
- Таблица лиц [Exam_Score] (person_id INT, exam_id INT, оценка INT)
Если либо Лицо, либо Экзамен удалены, вы также должны удалить ассоциированные записи Exam_Score.
Это невозможно, используя ON DELETE CASCADE в MS SQL Server, поэтому необходимость в триггерах.
(Извиняется Мехрдаду, который пытался объяснить это мне, но я полностью упустил его точку.)