Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Как да активирате ограничение CHECK в SQL Server (пример за T-SQL)

Ако имате CHECK ограничение в SQL Server, което в момента е деактивирано, можете да използвате кода по-долу, за да го активирате отново.

Когато активирате CHECK ограничение (или ограничение на външен ключ в този случай), имате възможност да укажете дали да проверите или не съществуващите данни в таблицата.

По-долу са дадени примери за код за активиране на CHECK ограничение, като посочва всяка от тези различни опции.

Пример 1 – Активиране на ограничение с помощта на WITH CHECK

Това е препоръчителният метод за активиране на вашия CHECK ограничения (освен ако нямате конкретна причина да не го използвате).

Ето пример за активиране на ограничение, наречено chkJobTitle :

ALTER TABLE Occupation  
WITH CHECK CHECK CONSTRAINT chkJobTitle;

Тук изрично посочвам WITH CHECK , което казва на SQL Server да провери съществуващите данни, преди да разреши ограничението. Ако някакви данни нарушават ограничението, ограничението няма да бъде активирано и ще получите грешка.

Това е добре, защото налага целостта на данните.

Когато създадете нов CHECK ограничение, това е настройката по подразбиране. Когато обаче активирате съществуващо ограничение (както правим тук), то не настройката по подразбиране.

Пример 2 – Активиране на ограничение с помощта на WITH NOCHECK

В този пример ограничението е активирано без проверка на съществуващите данни:

ALTER TABLE Occupation  
WITH NOCHECK CHECK CONSTRAINT chkJobTitle;

Тук изрично заявявам WITH NOCHECK , което казва на SQL Server да не проверява съществуващите данни. Това означава, че ограничението ще бъде активирано дори ако таблицата вече съдържа данни, които нарушават ограничението.

Това е настройката по подразбиране, когато активирате ограничение (но не и когато създавате такова).

Една от малкото причини (вероятно единствената причина) да използвате това е, ако искате да запазите невалидни данни в базата данни. Може би имате еднократно изключение, при което трябва да въведете ред или повече невалидни данни, но изисквате всички бъдещи данни да отговарят на ограничението.

Въпреки това, все още има рискове, свързани с това. Ето какво има да каже Microsoft за това:

Не препоръчваме да правите това, освен в редки случаи. Новото ограничение се оценява във всички по-късни актуализации на данни. Всички нарушения на ограниченията, които са потиснати от WITH NOCHECK когато се добави ограничението, може да доведе до неуспешни бъдещи актуализации, ако актуализират редове с данни, които не следват ограничението.

Така че използвайки WITH NOCHECK може потенциално да причини проблеми по-късно.

Пример 3 – Активиране на ограничение с помощта на опцията по подразбиране

Ето пример за използване на опцията по подразбиране:

ALTER TABLE Occupation  
CHECK CONSTRAINT chkJobTitle;

Този пример е еквивалент на предишния пример. Тъй като не посочих дали да проверя или не, SQL Server приема, че искам WITH NOCHECK .

Използването на WITH NOCHECK премахва доверието

Когато активирате ограничение с помощта на WITH NOCHECK , едно следствие, което трябва да знаете, е, че SQL Server вече не се доверява на това ограничение. Той го маркира като недоверен.

Да, правилно прочете. Всъщност има is_not_trusted флаг, който SQL Server задава на 1 когато деактивирате CHECK ограничение (което означава, че не е надеждно) и единственият начин да го настроите на 0 (доверен) е да посочите WITH CHECK при повторно активиране на ограничението. Използване на WITH NOCHECK просто не го реже.

Това е напълно логично. В крайна сметка, би ли ти вярвате ли на ограничение, което не е проверило всички данни?

С помощта на WITH CHECK , гарантирате, че ограничението проверява всички съществуващи данни, преди да бъде активирано. Единственият начин да бъде активиран е, ако всички съществуващи данни отговарят на ограничението. След като провери всички съществуващи данни, може да му се вярва.

За повече информация вижте Какво трябва да знаете за WITH NOCHECK, когато активирате ограничение CHECK в SQL Server, където можете да видите действителния is_not_trusted флагът се превключва напред-назад всеки път, когато деактивирам и активирам отново CHECK ограничение.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Дата на обработка в SQL Server

  2. Как да намеря дубликати в множество колони?

  3. Експортирайте таблица във файл със заглавки на колони (имена на колони) с помощта на помощната програма bcp и SQL Server 2008

  4. Тригер за актуализиране на SQL Server, Получавайте само променени полета

  5. Направете лесна производителност на SQL Server