Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So aktivieren Sie eine CHECK-Einschränkung in SQL Server (T-SQL-Beispiel)

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.