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

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

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.


  1. Indstilling af databaseadgangstilladelser

  2. Skal jeg bruge datatypen datetime eller timestamp i MySQL?

  3. Oversigt over DBCC SHRINKFILE Command

  4. Oracle partitioneret sekvens