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