АЛЬТЕР ТАБЛИЧНОГО ПЕРЕВІРУВАННЯ


25

З Провідника об’єктів у SQL сервері під час вибору та сценаріїв обмеження з іноземним ключем генерується наступний код.

     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

Яка мета останнього твердження "ПІДКЛЮЧИТИ ОГЛЯД ТАБЛИЦІ"? Здається, не має значення, керується він чи ні. Він не відмовляється від існуючих недостовірних даних, а також не змінює, що обмеження будуть застосовуватися до нових даних.

Спасибі!

Відповіді:


23

Це гарантує, що обмеження увімкнено після його створення. У вашій ALTER TABLEзаяві міститься WITH NOCHECKфрагмент, який говорить про те, щоб не перевіряти наявність наявних поганих даних під час створення обмеження.

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

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


Насправді я перевірив, що це не має значення, якщо є погані дані, перший чи другий рядок не вийде з ладу. Щоб зробити один провал, вони повинні були виглядати так:
Делюкс

2
ALTER TABLE [dbo]. [T2] With CHECK CHECK CONSTRAINT [FK_T2_T1]
Delux

Правильно. Але ви побачите, що це не вдасться після цього, коли в якийсь момент ви спробуєте запустити ВСТУП або ОНОВЛЕННЯ, що порушує обмеження. Вони не вийдуть з ладу, якщо в момент виконання цих 2 висловлювань є недостовірні дані.
squillman

7

Ваше перше твердження створює обмежене обмеження. Це потрібно включити і, можливо, довіряти йому. Наступний дивний синтаксис забезпечить увімкнення та довіру вашого обмеження:

ALTER TABLE YourTable
      WITH CHECK CHECK CONSTRAINT YourConstraint;

Є дуже хороша публікація в блозі Юго Корнеліса, яка пояснює це дуже докладно: Чи можете ви довіряти своїм обмеженням

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.