SQL Server: удаление строк с ограничениями внешнего ключа: могут ли транзакции переопределять ограничения? - PullRequest
6 голосов
/ 29 апреля 2010

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

Можно ли переопределить эти ограничения, вызвав несколько удалений внутри транзакции, в частности, «TransactionScope» в C #, или абсолютно необходимо каскадное удаление?

Ответы [ 5 ]

14 голосов
/ 29 апреля 2010

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

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

7 голосов
/ 29 апреля 2010

Единственный способ "переопределить" ограничение внешнего ключа - это отключить его:

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

Вам необходимо использовать команду ALTER TABLE, чтобы отключить ограничение, используя ключевое слово NOCHECK. IE:

ALTER TABLE dbo.cnst_example NOCHECK CONSTRAINT salary_cap;

Единственная другая альтернатива - удалить ограничение и добавить его при необходимости.

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

2 голосов
/ 29 апреля 2010

Вы не можете переопределить ограничения FK, если бы вы могли, в чем смысл их создавать?

1 голос
/ 02 октября 2015

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

1 голос
/ 29 апреля 2010

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

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