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

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

Когато се опитате да въведете данни в таблица, която има напълно активиран 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, за демонстрация на това как се засяга доверието, в зависимост от това как отново активирате ограничението.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да отпечатате VARCHAR(MAX) с помощта на Print Statement?

  2. Не използвайте sp_depends в SQL Server (оттеглен е)

  3. LEN() срещу DATALENGTH() в SQL Server

  4. SQL Server ЗА JSON AUTO Примери (T-SQL)

  5. Функции за сигурност в SQL Server 2017