it-swarm.com.de

Was ist eine WITH CHECK CHECK-Einschränkung?

Ich habe einige automatisch generierte T-SQL, die wahrscheinlich gültig ist, aber ich verstehe nicht wirklich.

ALTER TABLE [dbo].[MyTable]
WITH CHECK
CHECK CONSTRAINT [My_FORIEGN_KEY];

Ich weiß, was eine Fremdschlüsseleinschränkung ist, aber was ist das CHECK CHECK?

21
BanksySan

Die MSDN-Dokumentationsseite über ALTER TABLE erklärt Folgendes:

  • ALTER TABLE: Ändern Sie die Struktur der Tabelle
    (und einige der möglichen Aktionen/Änderungen sind):
    • CHECK CONSTRAINT ..: Aktivieren Sie die Einschränkung
    • NOCHECK CONSTRAINT ..: Deaktiviert die Einschränkung
      Es gibt auch zusätzliche optionale Schritte zum Erstellen/Aktivieren/Deaktivieren einer Einschränkung:
      • WITH CHECK: Überprüfen Sie auch die Einschränkung
      • WITH NOCHECK: Überprüfen Sie die Einschränkung nicht

In ihren Worten:

| [ WITH { CHECK | NOCHECK } ] { CHECK | NOCHECK } CONSTRAINT   
    { ALL | constraint_name [ ,...n ] }

...

WITH CHECK | WITH NOCHECK Gibt an, ob die Daten in der Tabelle validiert sind oder nicht gegen ein neu hinzugefügter oder wieder aktivierter FOREIGN KEY Oder CHECK Einschränkung. Wenn nicht angegeben, wird WITH CHECK Für neue Einschränkungen und WITH NOCHECK Für wieder aktivierte Einschränkungen angenommen.

Wenn Sie keine neuen CHECK - oder FOREIGN KEY - Einschränkungen für vorhandene Daten überprüfen möchten, verwenden Sie WITH NOCHECK. Wir empfehlen dies nicht, außer in seltenen Fällen. Die neue Einschränkung wird bei allen späteren Datenaktualisierungen ausgewertet. Verstöße gegen Einschränkungen, die beim Hinzufügen der Einschränkung durch WITH NOCHECK Unterdrückt werden, können dazu führen, dass zukünftige Aktualisierungen fehlschlagen, wenn Zeilen mit Daten aktualisiert werden, die der Einschränkung nicht entsprechen.

Das Abfrageoptimierungsprogramm berücksichtigt keine Einschränkungen, die definiert sind WITH NOCHECK. Solche Einschränkungen werden ignoriert, bis sie mithilfe der Tabelle ALTER TABLEWITH CHECK CHECK CONSTRAINT ALL Wieder aktiviert werden.

...

{ CHECK | NOCHECK } CONSTRAINT
Gibt an, dass der Einschränkungsname aktiviert oder deaktiviert ist. Diese Option kann nur mit den Einschränkungen FOREIGN KEY Und CHECK verwendet werden. Wenn NOCHECK angegeben wird, ist die Einschränkung deaktiviert und zukünftige Einfügungen oder Aktualisierungen der Spalte werden nicht anhand der Einschränkungsbedingungen überprüft. DEFAULT, PRIMARY KEY Und UNIQUE Einschränkungen können nicht deaktiviert werden.

Test in dbfiddle :

CREATE TABLE a (aid INT PRIMARY KEY);

GEHEN

INSERT INTO a (aid)
VALUES (1), (2), (3) ;

GEHEN

 3 Zeilen betroffen 
CREATE TABLE b 
( aid INT,
  bid INT PRIMARY KEY,
  CONSTRAINT [My_FORIEGN_KEY]
    FOREIGN KEY (aid) REFERENCES a (aid)
) ;

GEHEN

INSERT INTO b (aid, bid)
VALUES
  (1, 11),
  (1, 12),
  (2, 21), 
  (3, 31) ;

GEHEN

 4 Zeilen betroffen 
INSERT INTO b (aid, bid)
VALUES
  (6, 61),
  (6, 62) ;

GEHEN

 Nachricht 547 Level 16 Status 0 Zeile 1 
 Die INSERT-Anweisung stand in Konflikt mit der FOREIGN KEY-Einschränkung "My_FORIEGN_KEY". Der Konflikt trat in der Datenbank "fiddle_792fce5de09f42908c3a0f91421f3522", Tabelle "dbo.a", Spalte "Hilfe" auf. 
 Nachricht 3621 Ebene 0 Status 0 Zeile 1 
 Die Anweisung wurde beendet. 
SELECT * FROM b ;

GEHEN

 Hilfe | Gebot 
 -: | -: 
 1 | 11 
 1 | 12 
 2 | 21 
 3 | 31 
ALTER TABLE b NOCHECK CONSTRAINT [My_FORIEGN_KEY];   --disable

GEHEN

INSERT INTO b (aid, bid)
VALUES
  (4, 41),
  (4, 42) ;

GEHEN

 2 Zeilen betroffen 
SELECT * FROM b ;

GEHEN

 Hilfe | Gebot 
 -: | -: 
 1 | 11 
 1 | 12 
 2 | 21 
 3 | 31 
 4 | 41 
 4 | 42 
ALTER TABLE b WITH NOCHECK CHECK CONSTRAINT [My_FORIEGN_KEY];  
-- enable constraint without checking existing data

GEHEN

SELECT * FROM b ;

GEHEN

 Hilfe | Gebot 
 -: | -: 
 1 | 11 
 1 | 12 
 2 | 21 
 3 | 31 
 4 | 41 
 4 | 42 
INSERT INTO b (aid, bid)
VALUES
  (6, 61),
  (6, 62) ;

GEHEN

 Nachricht 547 Level 16 Status 0 Zeile 1 
 Die INSERT-Anweisung stand in Konflikt mit der FOREIGN KEY-Einschränkung "My_FORIEGN_KEY". Der Konflikt trat in der Datenbank "fiddle_792fce5de09f42908c3a0f91421f3522", Tabelle "dbo.a", Spalte "Hilfe" auf. 
 Nachricht 3621 Ebene 0 Status 0 Zeile 1 
 Die Anweisung wurde beendet. 
SELECT * FROM b ;

GEHEN

 Hilfe | Gebot 
 -: | -: 
 1 | 11 
 1 | 12 
 2 | 21 
 3 | 31 
 4 | 41 
 4 | 42 
ALTER TABLE b WITH CHECK CHECK CONSTRAINT [My_FORIEGN_KEY];  
-- check existing data and enable constraint 

GEHEN

 Nachricht 547 Level 16 Status 0 Zeile 1 
 Die Anweisung ALTER TABLE stand in Konflikt mit der FOREIGN KEY-Einschränkung "My_FORIEGN_KEY". Der Konflikt trat in der Datenbank "fiddle_792fce5de09f42908c3a0f91421f3522", Tabelle "dbo.a", Spalte "Hilfe" auf. 
31
ypercubeᵀᴹ

Lesen Sie den Artikel hier: https://msdn.Microsoft.com/en-us/library/ms190273.aspx

Es sagt uns: 'Das Abfrageoptimierungsprogramm berücksichtigt keine Einschränkungen, die MIT NOCHECK definiert sind. Solche Einschränkungen werden ignoriert, bis sie mithilfe der Tabelle ALTER TABLE WITH CHECK CHECK CONSTRAINT ALL 'wieder aktiviert werden.

Beachten Sie auch diesen Thread in StackOverflow: https://stackoverflow.com/questions/529941/with-check-add-constraint-followed-by-check-constraint-vs-add-constraint

1
George K