Du kan bruge koden nedenfor til at aktivere alle CHECK
og fremmednøgle begrænsninger for en specifik tabel i SQL Server.
Når du aktiverer en begrænsning i SQL Server, skal du beslutte, om den skal kontrollere eksisterende data eller ej. Dette er en vigtig overvejelse, hvis tabellen allerede indeholder data, fordi de eksisterende data potentielt kan overtræde begrænsningens regler.
Eksempler på erklæringer
Nedenfor er to eksempler på sætninger, der viser forskellen mellem at kontrollere eksisterende data og ikke at kontrollere dem, når du aktiverer begrænsningerne.
For at kontrollere eksisterende data skal du bruge WITH CHECK
i din erklæring, når du aktiverer begrænsningerne, ellers brug WITH NOCHECK
.
Med Check:
ALTER TABLE TableName WITH CHECK CHECK CONSTRAINT ALL
Uden kontrol:
ALTER TABLE TableName WITH NOCHECK CHECK CONSTRAINT ALL
Bare udskift TableName
med navnet på den relevante tabel.
Nedenfor er et eksempel, hvor jeg gør dette og tjekker resultaterne.
Eksempel 1 – Gennemgå begrænsningerne
Først vil jeg tage et hurtigt kig på den aktuelle CHECK
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 | 1 | 1 | | ConstraintTest | chkValidEndDate | 1 | 1 | | ConstraintTest | chkTeamSize | 1 | 1 | | Occupation | chkJobTitle | 0 | 0 | +----------------+-----------------+---------------+------------------+
Så der er i øjeblikket fire CHECK
begrænsninger i databasen, hvoraf tre er til ConstraintTest
tabel.
Vi kan se, at alle begrænsninger for tabellen er deaktiveret, fordi is_disabled er indstillet til 1 .
Vi kan også se, at is_not_trusted kolonne er indstillet til 1 for disse begrænsninger. Det betyder, at de ikke er tillid til. De kan ikke stole på, mens de er deaktiveret, fordi ugyldige data kan komme ind i databasen uden at blive kontrolleret. Mere om dette nedenfor.
Den anden begrænsning (for en anden tabel) er allerede aktiveret og har tillid til (men vi kan ignorere den tabel/den begrænsning i denne artikel).
Eksempel 2 – Aktiver begrænsningerne ved hjælp af MED KONTROL
Nu vil jeg aktivere alle begrænsninger for ConstraintTest
tabel:
ALTER TABLE ConstraintTest WITH CHECK CHECK CONSTRAINT ALL;
Det er det – færdigt.
Lad os nu køre 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 | 0 | 0 | | ConstraintTest | chkValidEndDate | 0 | 0 | | ConstraintTest | chkTeamSize | 0 | 0 | | Occupation | chkJobTitle | 0 | 0 | +----------------+-----------------+---------------+------------------+
Alle tre begrænsninger for ConstraintTest tabellen er nu aktiveret og har tillid til.
De er tillid til, fordi jeg brugte WITH CHECK
i min udtalelse. Hvis jeg ikke havde, ville jeg have fået et andet resultat, som du kan se nedenfor.
Ved at bruge WITH CHECK
, jeg kan være sikker på, at alle eksisterende data i tabellen faktisk overholder begrænsningerne.
Eksempel 3 – Aktiver begrænsningerne ved hjælp af MED NOCHECK
Nu genaktiverer jeg begrænsningerne ved hjælp af WITH CHECK
så vi kan se, hvordan dette påvirker resultatet.
Men først bliver jeg nødt til at deaktivere dem:
ALTER TABLE ConstraintTest NOCHECK CONSTRAINT ALL;
Tjek, at de er 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 | 1 | 1 | | ConstraintTest | chkValidEndDate | 1 | 1 | | ConstraintTest | chkTeamSize | 1 | 1 | | Occupation | chkJobTitle | 0 | 0 | +----------------+-----------------+---------------+------------------+
Så de er deaktiveret igen.
Genaktiver dem nu ved at bruge WITH NOCHECK
:
ALTER TABLE ConstraintTest WITH NOCHECK CHECK CONSTRAINT ALL;
Tjek igen:
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 | 1 | | ConstraintTest | chkValidEndDate | 0 | 1 | | ConstraintTest | chkTeamSize | 0 | 1 | | Occupation | chkJobTitle | 0 | 0 | +----------------+-----------------+---------------+------------------+
Vi kan se, at begrænsningerne er blevet aktiveret, men denne gang forbliver de upålidelige.
Begrænsningerne er ikke tillid til, fordi de ikke kontrollerede nogen eksisterende data, før de blev aktiveret.
Så det vigtigste her er, at hvis du vil have tillid til dine begrænsninger, skal du sørge for at bruge WITH CHECK
når du aktiverer dem.
Aktivering af begrænsninger individuelt
Hvis du ikke vil aktivere alle begrænsninger på én gang, kan du aktivere dem individuelt. Dette kan også være nyttigt, hvis du har brug for at aktivere alle begrænsninger, men du skal bruge forskellige indstillinger (f.eks. WITH CHECK
for nogle og WITH NOCHECK
for andre).
Se, hvordan man aktiverer en CHECK-begrænsning i SQL Server, og hvordan man aktiverer en fremmednøgle i SQL Server.