ALTER TABLE CHECK CONSTRAINT

25

В обозревателе объектов в SQL Server при выборе и создании сценария ограничения внешнего ключа создается следующий код.

     USE [MyTestDatabase]
     GO

     ALTER TABLE [dbo].[T2] WITH NOCHECK ADD CONSTRAINT [FK_T2_T1] FOREIGN KEY([T1ID])
     REFERENCES [dbo].[T1] ([T1ID])
     GO

     ALTER TABLE [dbo].[T2] CHECK CONSTRAINT [FK_T2_T1]
     GO

Какова цель последнего утверждения "ALTER TABLE CHECK CONSTRAINT"? Кажется, не имеет значения, запущен он или нет. Это не приводит к сбоям в существующих неверных данных и не меняет того, что ограничение будет применяться к новым данным.

Благодарность!

Delux
источник

Ответы:

23

Это гарантирует, что ограничение будет включено после его создания. Ваше ALTER TABLEутверждение включает WITH NOCHECKв себя часть, которая говорит, что не нужно проверять существующие неверные данные во время создания ограничения.

Как написано, существующие данные не будут проверяться на соответствие ограничениям из- WITH NOCHECKза первого оператора. Выполнение второго оператора включит проверку на соответствие для любых будущих изменений в таблице, которые охватываются этим ограничением, до момента ALTER TABLE [dbo].[T2] NOCHECK CONSTRAINT [FK_T2_T1]выдачи.

Заявления, как написано, в основном говорят: «Создайте это ограничение внешнего ключа, но не проверяйте его по существующим данным. Сделайте его активным для любых предстоящих изменений в данных».

squillman
источник
На самом деле я проверил это, это не имеет значения, если есть плохие данные, первая или вторая строка не потерпит неудачу. Чтобы сделать с одним провалом, они должны были бы выглядеть так:
Delux
2
ALTER TABLE [dbo]. [T2] с ограничением CHECK CHECK [FK_T2_T1]
Delux
Правильно. Но вы увидите, что после этого произойдет сбой, когда в какой-то момент вы попытаетесь запустить INSERT или UPDATE, которые нарушают ограничение. Ни один из них не завершится ошибкой, если во время выполнения этих двух операторов существуют неверные данные.
squillman
7

Ваш первый оператор создает отключенное ограничение. Это должно быть включено и возможно доверять. Следующий странный синтаксис обеспечит включение и надежность вашего ограничения:

ALTER TABLE YourTable
      WITH CHECK CHECK CONSTRAINT YourConstraint;

Уго Корнелис (Hugo Kornelis) написал очень хороший пост в блоге, который подробно объясняет это: можете ли вы доверять своим ограничениям?

Аляска
источник