Wenn Sie einen CHECK
haben Einschränkung in SQL Server, die derzeit deaktiviert ist, können Sie den folgenden Code verwenden, um sie wieder zu aktivieren.
Wenn Sie einen CHECK
aktivieren Einschränkung (oder eine Fremdschlüsseleinschränkung für diese Angelegenheit) haben Sie die Möglichkeit anzugeben, ob vorhandene Daten in der Tabelle überprüft werden sollen oder nicht.
Nachfolgend finden Sie Codebeispiele zum Aktivieren eines CHECK
Einschränkung, während Sie jede dieser verschiedenen Optionen angeben.
Beispiel 1 – Aktivieren Sie eine Einschränkung mit WITH CHECK
Dies ist die empfohlene Methode zur Aktivierung Ihres CHECK
Einschränkungen (es sei denn, Sie haben einen bestimmten Grund, es nicht zu verwenden).
Hier ist ein Beispiel für die Aktivierung einer Einschränkung namens chkJobTitle
:
ALTER TABLE Occupation WITH CHECK CHECK CONSTRAINT chkJobTitle;
Hier gebe ich ausdrücklich WITH CHECK
an , die SQL Server anweist, die vorhandenen Daten zu überprüfen, bevor die Einschränkung aktiviert wird. Wenn Daten gegen die Einschränkung verstoßen, wird die Einschränkung nicht aktiviert und Sie erhalten eine Fehlermeldung.
Das ist gut, weil es die Datenintegrität erzwingt.
Wenn Sie einen neuen CHECK
erstellen Einschränkung, dies ist die Standardeinstellung. Wenn Sie jedoch eine vorhandene Einschränkung aktivieren (wie wir es hier tun), ist dies nicht der Fall die Standardeinstellung.
Beispiel 2 – Aktivieren Sie eine Einschränkung mit WITH NOCHECK
In diesem Beispiel wird die Einschränkung aktiviert, ohne die vorhandenen Daten zu prüfen:
ALTER TABLE Occupation WITH NOCHECK CHECK CONSTRAINT chkJobTitle;
Hier gebe ich ausdrücklich WITH NOCHECK
an , die SQL Server anweist, die vorhandenen Daten nicht zu überprüfen. Das bedeutet, dass die Einschränkung aktiviert wird, selbst wenn die Tabelle bereits Daten enthält, die gegen die Einschränkung verstoßen.
Dies ist die Standardeinstellung beim Aktivieren einer Einschränkung (aber nicht beim Erstellen).
Einer der wenigen Gründe (wahrscheinlich der einzige Grund), warum Sie dies verwenden würden, ist, wenn Sie ungültige Daten in der Datenbank behalten möchten. Möglicherweise haben Sie eine einmalige Ausnahme, bei der Sie eine oder mehrere Zeilen mit ungültigen Daten eingeben müssen, aber alle zukünftigen Daten der Einschränkung entsprechen müssen.
Allerdings sind damit immer noch Risiken verbunden. Hier ist, was Microsoft dazu zu sagen hat:
Wir empfehlen dies nicht, außer in seltenen Fällen. Die neue Einschränkung wird in allen späteren Datenaktualisierungen ausgewertet. Alle Beschränkungsverletzungen, die durch WITH NOCHECK
unterdrückt werden Wenn die Einschränkung hinzugefügt wird, können zukünftige Aktualisierungen fehlschlagen, wenn sie Zeilen mit Daten aktualisieren, die der Einschränkung nicht folgen.
Verwenden Sie also WITH NOCHECK
könnte später möglicherweise Probleme verursachen.
Beispiel 3 – Aktivieren Sie eine Einschränkung mit der Standardoption
Hier ist ein Beispiel mit der Standardoption:
ALTER TABLE Occupation CHECK CONSTRAINT chkJobTitle;
Dieses Beispiel entspricht dem vorherigen Beispiel. Da ich nicht angegeben habe, ob geprüft werden soll oder nicht, geht SQL Server davon aus, dass ich WITH NOCHECK
möchte .
Die Verwendung von WITH NOCHECK entfernt das Vertrauen
Wenn Sie eine Einschränkung mit WITH NOCHECK
aktivieren , ist eine Konsequenz, der Sie sich bewusst sein sollten, dass SQL Server dieser Einschränkung nicht mehr vertraut. Es kennzeichnet es als nicht vertrauenswürdig.
Ja, Sie haben richtig gelesen. Es gibt tatsächlich einen is_not_trusted
Flag, das SQL Server auf 1
setzt wenn Sie einen CHECK
deaktivieren Einschränkung (was bedeutet, dass es nicht vertrauenswürdig ist) und die einzige Möglichkeit, es auf 0
zu setzen (vertrauenswürdig) ist WITH CHECK
anzugeben beim erneuten Aktivieren der Einschränkung. Verwenden von WITH NOCHECK
reicht einfach nicht.
Das macht durchaus Sinn. Schließlich würden Sie Einer Einschränkung vertrauen, die nicht alle Daten überprüft hat?
Durch die Verwendung von WITH CHECK
stellen Sie sicher, dass die Einschränkung alle vorhandenen Daten überprüft, bevor sie aktiviert wird. Sie kann nur aktiviert werden, wenn alle vorhandenen Daten der Einschränkung entsprechen. Sobald es alle vorhandenen Daten überprüft hat, kann man ihm vertrauen.
Weitere Informationen hierzu finden Sie unter Was Sie über WITH NOCHECK wissen sollten, wenn Sie eine CHECK-Einschränkung in SQL Server aktivieren, wo Sie den tatsächlichen is_not_trusted
sehen können Flag wird jedes Mal hin und her geschaltet, wenn ich ein CHECK
deaktiviere und wieder aktiviere Einschränkung.