Du kan bruge koden nedenfor til at deaktivere alle CHECK
og fremmednøgle begrænsninger for den aktuelle database i SQL Server.
EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"
Dette bruger Microsofts udokumenterede sp_MSforeachtable
gemt procedure. Denne procedure giver dig mulighed for at udføre opgaver mod hver tabel i en database. Så det er perfekt til vores opgave her - at deaktivere alle CHECK
begrænsninger i den aktuelle database.
Nedenfor er et eksempel, hvor jeg gør dette og derefter tjekker resultatet.
Eksempel 1 – Gennemgå begrænsningerne
Først vil jeg tage et hurtigt kig på den aktuelle CHECK
og fremmednøgle-begrænsninger i databasen for at se, om de er aktiveret eller deaktiveret.
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å der er i øjeblikket fire CHECK
begrænsninger i databasen for to forskellige tabeller.
Vi kan se, at alle begrænsninger er aktiveret, fordi er_deaktiveret er indstillet til 0 .
Eksempel 2 – Deaktiver begrænsningerne
Nu vil jeg deaktivere alle begrænsninger:
EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"
Det er normalt en god idé at sikre sig, at du bruger den korrekte database, når du laver ting som dette. Så vi kunne tilføje ovenstående kode ved eksplicit at skifte til den korrekte database:
USE Test; EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"
I dette tilfælde skifter jeg til en database kaldet Test .
Eksempel 3 – Tjek resultatet
Efter at have kørt ovenstående kode, kører jeg nu den samme forespørgsel fra det første eksempel for at 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å alle begrænsninger i databasen er blevet deaktiveret (fordi is_disabled kolonne er indstillet til 1 for disse begrænsninger).
Bemærk, at is_not_trusted kolonne er også indstillet til 1 . Dette er en vigtig overvejelse, især hvis du har til hensigt at genaktivere nogen af dine deaktiverede begrænsninger.
Se Hvad du bør vide om MED NOCHECK, når du aktiverer en CHECK-begrænsning i SQL Server for at få oplysninger om, hvordan du genopretter tillid, når du genaktiverer dine begrænsninger. Oplysningerne i den artikel gælder også for fremmednøgler.
Deaktiver begrænsningerne individuelt
Hvis du kun ønsker at deaktivere begrænsningerne én efter én, se Sådan deaktiveres en CHECK-begrænsning i SQL Server for eksempler.