sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan aktiveres alle CHECK &fremmednøglebegrænsninger for en tabel i SQL Server (T-SQL-eksempler)

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.


  1. Hvordan vælger jeg mellem den 1. dag i den aktuelle måned og den aktuelle dag i MySQL?

  2. Hvordan sender du et argument til en PL/SQL-blok i en sql-fil kaldet ved hjælp af START i sqlplus?

  3. SQL Server Indsæt eksempel

  4. SQLite Like() Funktion med eksempler