När du försöker mata in data i en tabell som har en fullt aktiverad CHECK
begränsning, kommer du bara att lyckas om informationen inte bryter mot den begränsningen. Om du försöker ange ogiltiga data kommer operationen att misslyckas med ett fel.
Men tänk om du hamnar i situationen där du verkligen måste infoga data som bryter mot CHECK
begränsning? Kanske gäller begränsningen inte längre, eller så kanske du har ett undantag där en rad tillåts kringgå begränsningen. Hur som helst kommer du inte att kunna ange något utanför reglerna för begränsningen.
Om du hamnar i den här situationen kan du alltid inaktivera begränsningen. Så här gör du det med Transact-SQL.
Exempel 1 – Inaktivera CHECK-begränsningen
För att inaktivera en CHECK
begränsning, använd NOCHECK
argument i en ALTER TABLE
uttalande.
Så här:
ALTER TABLE Occupation NOCHECK CONSTRAINT chkJobTitle;
Den här koden inaktiverar en begränsning som kallas chkJobTitle .
Exempel 2 – Granska kontrollbegränsningen
Vi kan fråga sys.check_constraints
systemvy för att verifiera att vår begränsning har inaktiverats:
SELECT name, is_disabled, is_not_trusted, definition FROM sys.check_constraints;
Resultat:
+-----------------+---------------+------------------+----------------------------------------+ | name | is_disabled | is_not_trusted | definition | |-----------------+---------------+------------------+----------------------------------------| | chkPrice | 0 | 0 | ([Price]>(0)) | | chkValidEndDate | 0 | 0 | ([EndDate]>=[StartDate]) | | chkTeamSize | 0 | 0 | ([TeamSize]>=(5) AND [TeamSize]<=(20)) | | chkJobTitle | 1 | 1 | ([JobTitle]<>'Digital Nomad') | +-----------------+---------------+------------------+----------------------------------------+
I det här fallet valde jag alla CHECK
begränsningar från den aktuella databasen.
Vi kan se att detta är den enda som är inaktiverad (eftersom dess is_disabled kolumnen är inställd på 1 ).
Du kanske märker att
is_not_trusted
kolumnen är också inställd på
1
. Detta indikerar att CHECK
begränsning har inte verifierats av systemet för alla rader.
Med andra ord kan vi inte längre anta att begränsningen har kontrollerat all data. Det faktum att begränsningen är inaktiverad innebär att data nu kan komma in i databasen utan att kontrolleras av begränsningen. Därför finns det risk för att ogiltiga data finns i databasen.
Om du någonsin behöver återaktivera CHECK
begränsning, kommer du att ha möjlighet att återställa begränsningens förtroende (genom att använda WITH CHECK
alternativ). Detta kommer att kontrollera alla befintliga rader innan begränsningen aktiveras.
Du kommer också att ha möjlighet att inte kontrollera befintliga data, men detta bör endast göras i sällsynta fall.
Se vad du bör veta om MED NOCHECK när du aktiverar en CHECK-begränsning i SQL Server för en demonstration av hur förtroende påverkas, beroende på hur du återaktiverar begränsningen.