O tworzeniu CONSTRAIN-ów na przykładzie CHECK-a opowiadałem tutaj
No cóż, dodając CHECK do tabeli, która zawiera już dane możesz doświadczyć pewnych problemów:
ALTER TABLE TESTADD CONSTRAINT Test_Value CHECK (Value>20) Msg 547, Level 16, State 0, Line 1
The ALTER TABLE statement conflicted with the CHECK constraint „Test_Value”. The conflict occurred in database „Test”, table „dbo.Test”, column 'Value’.
Zazwyczaj oznacza to, że w tabeli masz aktualnie dane nie spełniające warunku określonego w CHECK-u, w naszym przypadku liczby mniejsze lub równe 20.
Wiadomo – skoro nakładasz nowe ograniczenie to pewnie powinieneś ustalić co zrobić z tymi niekompatybilnymi danymi. Ale jeżeli akurat teraz nie masz na to czasu to możesz skorzystać ze specjalnej opcji NOCHECK powodującej, że podczas zakładania nowego CONSTRAIN-a (tutaj CHECK-a) dane aktualnie znajdujące się w tabeli nie będą sprawdzane:
ALTER TABLE TEST WITH NOCHECK ADD CONSTRAINT Test_Value CHECK (Value>20)
teraz komunikatu o błędzie już nie ma! Czy jedak można zaufać takiemu CHECK-owi? Przecież wyraźnie określiliśmy, że CHECK ma nie wpuszczać do kolumny VALUE wartości <=20! Ktoś widząc taki zapis mógłby sądzić, że rzeczywiście w kolumnie Value wszystkie wartości są większe niż 20!
Serwer zapamiętuje na szczęście o naszym CHECK-u informację, czy można mu ufać, czy nie. Zobacz wynik tego zapytania:
SELECT name, is_not_trustedFROM sys.check_constraints;
W naszym przypadku otrzymujemy:
name is_not_trusted -------------------- -------------- Test_Value 1
Dopiero kiedy poprawisz dane i włączysz na nowo CHECK z opcją WITH CHECK (lub ją pominiesz, bo jest domyślna) to wartość w sys.check_constraints w kolumnie is_not_trusted zostanie zmieniona na 0.
Chcesz wiedzieć więcej, zapraszam na kurs 6232. Zapraszam na autoryzowane szkolenia Microsoft w Opolu, Katowicach i Warszawie.
Komentarze:
[…] Zazwyczaj oznacza to, ?e w tabeli masz aktualnie dane nie spe?niaj?ce tego warunku, w naszym przypadku liczby z zakresu 11-20.
[…] Opcja NOCHECK przy zmianie CONSTRAINA i zaufanie do niego […]