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.