sql >> Databasteknik >  >> RDS >> Sqlserver

Hur man inaktiverar alla CHECK &främmande nyckelbegränsningar i en databas i SQL Server (T-SQL-exempel)

Du kan använda koden nedan för att inaktivera alla CHECK och främmande nyckelbegränsningar för den aktuella databasen i SQL Server.

EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"

Detta använder Microsofts odokumenterade sp_MSforeachtable lagrad procedur. Denna procedur låter dig utföra uppgifter mot varje tabell i en databas. Så det är perfekt för vår uppgift här – att inaktivera alla CHECK begränsningar inom den aktuella databasen.

Nedan är ett exempel där jag gör detta och sedan kontrollerar resultatet.

Exempel 1 – Granska begränsningarna

Först ska jag ta en snabb titt på den nuvarande CHECK och främmande nyckelbegränsningar i databasen, för att se om de är aktiverade eller inaktiverade.

SELECT
  OBJECT_NAME(parent_object_id) AS 'Table',
  name AS 'Constraint',
  is_disabled, 
  is_not_trusted
FROM sys.foreign_keys
UNION
SELECT 
  OBJECT_NAME(parent_object_id),
  name,
  is_disabled, 
  is_not_trusted
FROM sys.check_constraints;

Resultat:

+----------------+-----------------+---------------+------------------+
| Table          | Constraint      | is_disabled   | is_not_trusted   |
|----------------+-----------------+---------------+------------------|
| ConstraintTest | chkPrice        | 0             | 0                |
| ConstraintTest | chkValidEndDate | 0             | 0                |
| ConstraintTest | chkTeamSize     | 0             | 0                |
| Occupation     | chkJobTitle     | 0             | 0                |
+----------------+-----------------+---------------+------------------+

Så det finns för närvarande fyra CHECK begränsningar i databasen, för två olika tabeller.

Vi kan se att alla begränsningar är aktiverade eftersom är_avaktiverad är inställd på 0 .

Exempel 2 – Inaktivera begränsningarna

Nu inaktiverar jag alla begränsningar:

EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"

Det är vanligtvis en bra idé att se till att du använder rätt databas när du gör sådant här. Så vi kan lägga till ovanstående kod genom att explicit byta till rätt databas:

USE Test;
EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"

I det här fallet byter jag till en databas som heter Test .

Exempel 3 – Kontrollera resultatet

Efter att ha kört ovanstående kod kör jag nu samma fråga från det första exemplet för att se resultatet.

SELECT
  OBJECT_NAME(parent_object_id) AS 'Table',
  name AS 'Constraint',
  is_disabled, 
  is_not_trusted
FROM sys.foreign_keys
UNION
SELECT 
  OBJECT_NAME(parent_object_id),
  name,
  is_disabled, 
  is_not_trusted
FROM sys.check_constraints;

Resultat:

+----------------+-----------------+---------------+------------------+
| Table          | Constraint      | is_disabled   | is_not_trusted   |
|----------------+-----------------+---------------+------------------|
| ConstraintTest | chkPrice        | 1             | 1                |
| ConstraintTest | chkValidEndDate | 1             | 1                |
| ConstraintTest | chkTeamSize     | 1             | 1                |
| Occupation     | chkJobTitle     | 1             | 1                |
+----------------+-----------------+---------------+------------------+

Så alla begränsningar i databasen har inaktiverats (eftersom is_disabled kolumnen är inställd på 1 för dessa begränsningar).

Lägg märke till att is_not_trusted kolumnen är också inställd på 1 . Detta är ett viktigt övervägande, särskilt om du tänker återaktivera någon av dina inaktiverade begränsningar.

Se Vad du bör veta om MED NOCHECK när du aktiverar en CHECK-begränsning i SQL Server för information om hur du återställer förtroende när du återaktiverar dina begränsningar. Informationen i den artikeln gäller även främmande nycklar.

Inaktivera begränsningarna individuellt

Om du bara vill inaktivera begränsningarna en i taget, se Hur man inaktiverar en CHECK-begränsning i SQL Server för exempel.


  1. Villkorlig lead/lag-funktion PostgreSQL?

  2. Trace Flag 2389 och den nya Cardinality Estimator

  3. Hur man ändrar språk när man formaterar nummer i PostgreSQL

  4. Vad betyder SQL Select-symbolen || betyda?