sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man inaktiverar en CHECK-begränsning i SQL Server (T-SQL-exempel)

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.


  1. Använda en variabel i OPENROWSET Query

  2. Finns det en Profiler-motsvarighet för MySql?

  3. Det går inte att infoga explicit värde för identitetskolumnen i tabellen "tabell" när IDENTITY_INSERT är inställt på AV

  4. Hur man anger en flik i en postgres front-end COPY