Каскадировать на Удалить или использовать Триггеры? - PullRequest
11 голосов
/ 22 сентября 2009

Я работаю над проектом, который взял на себя, и со стороны базы данных я заметил, что предыдущие программисты написали несколько триггеров для удаления дочерних записей. Дело в том, что эти записи уже имеют отношение внешнего ключа к родительской записи, которую я удаляю. Триггеры удаления - не что иное, как простые операторы удаления для дочерних записей.

Есть ли преимущество в написании триггера для удаления дочерних записей, или я могу просто изменить его на каскадный при удалении и все будет в порядке?

Я использую MSSQL 2008.

Ответы [ 4 ]

16 голосов
/ 22 сентября 2009

УДАЛЕНИЕ КАСКАДА в 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, поэтому необходимы триггеры.

(Прошу прощения у Мердада, который пытался объяснить это мне, но я полностью упустил его мысль.)

10 голосов
/ 22 сентября 2009

Держитесь подальше от ненужных триггеров.

Перейдите с ON DELETE CASCADE, если это все, что вам нужно сделать.

1 голос
/ 23 сентября 2009

Я почти согласен с Dems здесь, за исключением того, что я использую ON DELETE CASCADEON UPDATE CASCADE в этом отношении) ссылочные действия везде, где это возможно, и прибегаю к использованию триггеров только там, где это необходимо. Я бы также рассмотрел возможность отзыва разрешений из таблиц и принудительного использования «вспомогательных» хранимых процедур для удалений и обновлений.

Назовите меня оптимистом, но я верю, что а) мой код выживет при портировании на будущий выпуск MS SQL Server и б) команда SQL Server однажды скоро найдет решение для ограничения «одного каскада», при котором Дык я заменю триггеры каскадными ссылочными действиями:)

1 голос
/ 22 сентября 2009

Я бы использовал каскад при удалении, но это только в том случае, если вы определенно хотите удалить дочерний элемент, если родительский элемент удален.

Если у вас есть какая-либо условная логика (я удаляю ребенка, только если он был удален в воскресенье), используйте триггер.

Я бы просто изменил его на cascade on delete в системе разработки, затем запустил мои модульные тесты и убедился, что ничего не сломалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...