ОГРАНИЧЕНИЕ CHECK ALTER TABLE

Из Обозревателя объектов в 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"? Это, кажется, не имеет значения, выполняется ли это. Это не перестало работать на существующих неправильных данных, и при этом это не изменяет это, ограничение будет осуществлено на новых данных.

Спасибо!

25
21.01.2020, 13:35
2 ответа

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

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

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

23
24.01.2020, 22:50
  • 1
    На самом деле я проверил, что, это не имеет значения, если будут неправильные данные, то первая или вторая строка не перестанет работать. Для создания с одним сбоем они должны были бы быть похожими на это: –  Delux 13.09.2012, 23:17
  • 2
    ALTER TABLE [dbo]. [T2] С Правом ограничения CHECK [FK_T2_T1] –  Delux 13.09.2012, 23:18
  • 3
    ПРОВЕРКИ. Но Вы будете видеть, что он перестал работать после этого, когда в какой-то момент Вы попытаетесь выполнить ВСТАВКУ или ОБНОВЛЕНИЕ, которое нарушает ограничение. Ни один не перестанет работать, если неправильные данные будут существовать в то время, когда те 2 оператора выполняются. –  squillman 13.09.2012, 23:19

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

ALTER TABLE YourTable
      WITH CHECK CHECK CONSTRAINT YourConstraint;

Существует очень хорошее сообщение в блоге Hugo Kornelis, который объясняет это в хороших деталях: можно ли доверять ограничениям

7
24.01.2020, 22:50

Теги

Похожие вопросы