Когато се опитате да въведете данни в таблица, която има напълно активиран CHECK
ограничение, ще бъдете успешни само ако данните не нарушават това ограничение. Ако се опитате да въведете невалидни данни, операцията ще се провали с грешка.
Но какво ще стане, ако се окажете в ситуацията, в която наистина трябва вмъкнете данни, които ще нарушат CHECK
ограничение? Може би ограничението вече не се прилага или може би имате изключение, при което на един ред е позволено да заобиколи ограничението. Така или иначе няма да можете да въвеждате нищо извън правилата на ограничението.
Ако се окажете в тази ситуация, винаги можете да деактивирате ограничението. Ето как да направите това с Transact-SQL.
Пример 1 – Деактивирайте ограничението CHECK
За да деактивирате CHECK
ограничение, използвайте NOCHECK
аргумент в ALTER TABLE
изявление.
Като това:
ALTER TABLE Occupation NOCHECK CONSTRAINT chkJobTitle;
Този код деактивира ограничение, наречено chkJobTitle .
Пример 2 – Прегледайте ограничението CHECK
Можем да потърсим sys.check_constraints
системен изглед, за да проверите дали нашето ограничение е деактивирано:
SELECT name, is_disabled, is_not_trusted, definition FROM sys.check_constraints;
Резултат:
+-----------------+---------------+------------------+----------------------------------------+ | 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') | +-----------------+---------------+------------------+----------------------------------------+
В този случай избрах всички CHECK
ограничения от текущата база данни.
Можем да видим, че това е единственият, който е деактивиран (защото is_disabled колоната е настроена на 1 ).
Може да забележите, че
is_not_trusted
колоната също е настроена на
1
. Това показва, че CHECK
ограничението не е проверено от системата за всички редове.
С други думи, вече не можем да приемем, че ограничението е проверило всички данни. Фактът, че ограничението е деактивирано, означава, че данните вече могат да влязат в базата данни, без да бъдат проверявани от ограничението. Следователно съществува потенциал за невалидни данни да присъстват в базата данни.
Ако някога се наложи да активирате отново CHECK
ограничение, ще имате възможност да възстановите доверието на ограничението (като използвате WITH CHECK
опция). Това ще провери всички съществуващи редове, преди да активирате ограничението.
Ще имате и опцията не проверка на съществуващите данни, но това трябва да се прави само в редки случаи.
Вижте какво трябва да знаете за WITH NOCHECK, когато активирате ограничение CHECK в SQL Server, за демонстрация на това как се засяга доверието, в зависимост от това как отново активирате ограничението.