ZMIEŃ KONTROLĘ TABELI

25

Z Eksploratora obiektów w programie SQL Server podczas wybierania i wykonywania skryptów ograniczenia klucza obcego generowany jest następujący kod.

     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

Jaki jest cel ostatniego stwierdzenia „ALTER TABLE CHECK CONSTRAINT”? Wydaje się, że nie ma znaczenia, czy jest uruchamiany. Nie zawodzi w przypadku istniejących złych danych ani nie zmienia, że ​​ograniczenie będzie wymuszane dla nowych danych.

Dzięki!

Delux
źródło

Odpowiedzi:

23

Zapewnia włączenie ograniczenia po jego utworzeniu. Twoje ALTER TABLEoświadczenie zawiera WITH NOCHECKfragment, który mówi, aby nie sprawdzać istniejących złych danych podczas tworzenia ograniczenia.

Jak napisano, istniejące dane nie będą sprawdzane pod kątem ograniczenia z powodu WITH NOCHECKpierwszej instrukcji. Wydanie drugiej instrukcji umożliwi sprawdzenie zgodności z ograniczeniem dla wszelkich przyszłych zmian w tabeli, które są objęte ograniczeniem, aż do momentu wydania an ALTER TABLE [dbo].[T2] NOCHECK CONSTRAINT [FK_T2_T1].

Instrukcje, jak napisano, w zasadzie mówią „Utwórz to ograniczenie klucza obcego, ale nie sprawdzaj go względem istniejących danych. Uaktywnij je dla wszelkich nadchodzących zmian danych”.

squillman
źródło
Właściwie to sprawdziłem, nie ma znaczenia, czy są złe dane, pierwsza lub druga linia nie zawiedzie. Aby zrobić z jednym niepowodzeniem, musieliby wyglądać tak:
Delux,
2
ALTER TABLE [dbo]. [T2] WITH CONSTRAINT CHECK CONSTRAINT [FK_T2_T1]
Delux
Dobrze. Ale potem się nie powiedzie, gdy w pewnym momencie spróbujesz uruchomić INSERT lub UPDATE, która narusza ograniczenie. Żadne nie zawiedzie, jeśli w chwili wykonania tych 2 instrukcji istnieją złe dane.
squillman
7

Twoje pierwsze oświadczenie tworzy ograniczenie wyłączone. Musi być włączony i prawdopodobnie zaufany. Poniższa dziwna składnia sprawi, że twoje ograniczenie zostanie włączone i zaufane:

ALTER TABLE YourTable
      WITH CHECK CHECK CONSTRAINT YourConstraint;

Jest bardzo dobry post na blogu autorstwa Hugo Kornelisa, który wyjaśnia go szczegółowo: Czy możesz zaufać swoim ograniczeniom

AK
źródło