Подтвердить что ты не робот

Предоставляет ли SQL Server ограничение ограничений в транзакции до тех пор, пока оно еще не выполнено?

Предоставляет ли SQL Server ограничение ограничений (т.е. отложенные ограничения) в транзакции до тех пор, пока транзакция еще не была выполнена?

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

4b9b3361

Ответ 1

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

SET DISABLE_DEF_CNST_CHK ON

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

Некоторые RDBMS позволяют это (например, Oracle, Postgres, Interbase)

Connect

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

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

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

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

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

Отправленный Sameer [MSFT] 10/13/2006 в 1: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

Ответ 2

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

ALTER TABLE mytable NOCHECK CONSTRAINT myconstraint

--... RUN TRANSACTION

ALTER TABLE mytable WITH CHECK CHECK CONTRAINT ALL

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

Ответ 3

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

Ответ 4

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

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