ALTER TABLE CHECK CONSTRAINT

25

Aus dem Objekt-Explorer in SQL Server wird beim Auswählen und Skripten einer Fremdschlüsseleinschränkung der folgende Code generiert.

     USE [MyTestDatabase]
     GO

     ALTER TABLE [dbo].[T2] WITH NOCHECK ADD CONSTRAINT [FK_T2_T1] FOREIGN KEY([T1ID])
     REFERENCES [dbo].[T1] ([T1ID])
     GO

     ALTER TABLE [dbo].[T2] CHECK CONSTRAINT [FK_T2_T1]
     GO

Was ist der Zweck der letzten Anweisung "ALTER TABLE CHECK CONSTRAINT"? Es scheint egal zu sein, ob es ausgeführt wird oder nicht. Es schlägt weder bei vorhandenen fehlerhaften Daten fehl, noch ändert es etwas daran, dass die Einschränkung für neue Daten erzwungen wird.

Vielen Dank!

Delux
quelle

Antworten:

23

Dadurch wird sichergestellt, dass die Einschränkung nach ihrer Erstellung aktiviert wird. Ihre ALTER TABLEAussage beinhaltet, WITH NOCHECKwelches Teil besagt, dass während der Erstellung der Einschränkung nicht auf vorhandene fehlerhafte Daten geprüft werden soll.

Wie geschrieben, werden die vorhandenen Daten aufgrund der WITH NOCHECKin der ersten Anweisung angegebenen Bedingung nicht gegen die Bedingung geprüft . Wenn Sie die zweite Anweisung absetzen, können Sie anhand der Einschränkung prüfen, ob zukünftige Änderungen an der Tabelle, die von der Einschränkung abgedeckt werden, bis zu dem Zeitpunkt, an dem eine ALTER TABLE [dbo].[T2] NOCHECK CONSTRAINT [FK_T2_T1]ausgegeben wird, vorliegen.

In den Anweisungen heißt es im Wesentlichen: "Erstellen Sie diese Fremdschlüsseleinschränkung, aber vergleichen Sie sie nicht mit vorhandenen Daten. Aktivieren Sie sie für bevorstehende Änderungen an den Daten."

Squillman
quelle
Eigentlich habe ich das überprüft, es macht keinen Unterschied, ob es schlechte Daten gibt, die erste oder zweite Zeile wird nicht ausfallen. Um mit einem Fehler fertig zu werden,
müssten
2
ALTER TABLE [dbo]. [T2] MIT CHECK CHECK CONSTRAINT [FK_T2_T1]
Delux
Recht. Aber Sie werden feststellen, dass es danach fehlschlägt, wenn Sie irgendwann versuchen, ein INSERT oder UPDATE auszuführen, das die Einschränkung verletzt. Keiner von beiden schlägt fehl, wenn zum Zeitpunkt der Ausführung dieser beiden Anweisungen fehlerhafte Daten vorliegen.
squillman
7

Ihre erste Anweisung erstellt eine deaktivierte Einschränkung. Es muss aktiviert und möglicherweise vertrauenswürdig sein. Die folgende ungewöhnliche Syntax stellt sicher, dass Ihre Einschränkung aktiviert und vertrauenswürdig ist:

ALTER TABLE YourTable
      WITH CHECK CHECK CONSTRAINT YourConstraint;

Es gibt einen sehr guten Blogbeitrag von Hugo Kornelis, der es ausführlich erklärt: Können Sie Ihren Zwängen vertrauen?

AK
quelle