Opcja NOCHECK przy zmianie CONSTRAINA i zaufanie do niego

14-wrz-2011

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 TEST
ADD 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_trusted
FROM   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:

  1. Mobilo » Blog Archive » Jak zmieni? CHECK na tabeli czyli jak wykona? ALTER CHECK? napisał,

    […] Zazwyczaj oznacza to, ?e w tabeli masz aktualnie dane nie spe?niaj?ce tego warunku, w naszym przypadku liczby z zakresu 11-20.

  2. Mobilo » Blog Archive » CHECK i problem z NULL napisał,

    […] Opcja NOCHECK przy zmianie CONSTRAINA i zaufanie do niego […]

Autor: Rafał Kraik