Разрешает ли SQL Server нарушение ограничений в транзакции, если она еще не зафиксирована? - PullRequest
34 голосов
/ 12 мая 2011

Разрешает ли SQL Server нарушение ограничений (т. Е. Отложенные ограничения) в транзакции, если транзакция еще не зафиксирована?

У меня есть запущенная незафиксированная транзакция, и пока этатранзакция выполняется, я изменю свои данные так, чтобы они нарушали некоторые ограничения (например, наличие дублированных первичных ключей, например).Когда я фиксирую транзакцию, данные будут в согласованном, действительном состоянии.Это вообще разрешено в SQL и особенно в MS SQL Server?

Ответы [ 4 ]

30 голосов
/ 12 мая 2011

Нет, извините. SQL Server не допускает отложенных ограничений в транзакции. Он присутствовал в SQL Server 6.5, но удален в SQL Server 2000:

SET DISABLE_DEF_CNST_CHK ON

Каждое отдельное утверждение должно быть согласованным и т. Д. Независимо от того, находится ли оно в транзакции

Некоторые РСУБД допускают это (например, Oracle, Postgres, Interbase)

Connect

Существует запрос Microsoft Connect , созданный в 2006 году, запрашивающий эту функцию:

Возможность отложить проверку ограничений внешнего ключа до фиксации транзакции

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

Разрешить отсрочку проверки ограничения ссылочной целостности до времени фиксации транзакции (как опция). Предложите предоставить опцию BEGIN TRANSACTION, которая указывает это.

Последний ответ от Microsoft пришел десятилетие назад:

Автор: Sameer [MSFT] 13.10.2006, 13:35

Привет, Грег,

Спасибо за отзыв. Мы знаем об этом и изучаем его в будущем выпуске.

Самер Верхедкар
SQL Engine
[MSFT]

Что говорит Microsoft за "уходи" .

SQL-92 определяет его

Функция была определена в июле 1992 года с SQL-92 . Пример синтаксиса будет:

BEGIN TRANSACTION
   SET CONSTRAINTS ALL DEFERRED --applies only to the current transaction

   INSERT Customers ...
   INSERT Orders ...
   UPDATE Customers ... --add the thing we were missing

COMMIT TRANSACTION
5 голосов
/ 12 мая 2011

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

ALTER TABLE mytable NOCHECK CONSTRAINT myconstraint

--... RUN TRANSACTION

ALTER TABLE mytable WITH CHECK CHECK CONTRAINT ALL

Предупреждение : Это повлияет на все соединения.

1 голос
/ 18 января 2016

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

0 голосов
/ 17 июля 2019

SQL Server не имеет опции отложенных ограничений.Но в некоторых случаях вы можете использовать Bulk Insert, которая поддерживает игнорирование ограничений без проблем отключения.Для получения дополнительной информации вы можете просмотреть следующие ссылки:

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

...