Sie können den folgenden Code verwenden, um alle CHECK
zu aktivieren und Fremdschlüsseleinschränkungen für eine bestimmte Tabelle in SQL Server.
Wenn Sie eine Einschränkung in SQL Server aktivieren, müssen Sie entscheiden, ob vorhandene Daten überprüft werden sollen oder nicht. Dies ist eine wichtige Überlegung, wenn die Tabelle bereits Daten enthält, da diese vorhandenen Daten möglicherweise gegen die Regeln der Einschränkung verstoßen.
Beispielaussagen
Im Folgenden finden Sie zwei Beispielanweisungen, die den Unterschied zwischen dem Prüfen vorhandener Daten und dem Nichtprüfen bei Aktivierung der Einschränkungen zeigen.
Um vorhandene Daten zu prüfen, verwenden Sie WITH CHECK
in Ihrer Anweisung, wenn Sie die Einschränkungen aktivieren, verwenden Sie andernfalls WITH NOCHECK
.
Mit Check:
ALTER TABLE TableName WITH CHECK CHECK CONSTRAINT ALL
Ohne Häkchen:
ALTER TABLE TableName WITH NOCHECK CHECK CONSTRAINT ALL
Ersetzen Sie einfach TableName
mit dem Namen der entsprechenden Tabelle.
Unten ist ein Beispiel, wo ich das mache und die Ergebnisse überprüfe.
Beispiel 1 – Überprüfen Sie die Einschränkungen
Zuerst werfe ich einen kurzen Blick auf den aktuellen CHECK
Beschränkungen in der Datenbank, um zu sehen, ob sie aktiviert oder deaktiviert sind.
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;
Ergebnis:
+----------------+-----------------+---------------+------------------+ | Table | Constraint | is_disabled | is_not_trusted | |----------------+-----------------+---------------+------------------| | ConstraintTest | chkPrice | 1 | 1 | | ConstraintTest | chkValidEndDate | 1 | 1 | | ConstraintTest | chkTeamSize | 1 | 1 | | Occupation | chkJobTitle | 0 | 0 | +----------------+-----------------+---------------+------------------+
Es gibt also derzeit vier CHECK
Constraints in der Datenbank, von denen drei für den ConstraintTest
sind Tabelle.
Wir können sehen, dass alle Einschränkungen für die Tabelle deaktiviert sind, weil is_disabled auf 1 gesetzt ist .
Wir können auch sehen, dass is_not_trusted ist Spalte ist auf 1 gesetzt für diese Einschränkungen. Dies bedeutet, dass ihnen nicht vertraut wird. Solange sie deaktiviert sind, kann ihnen nicht vertraut werden, da ungültige Daten ungeprüft in die Datenbank gelangen können. Mehr dazu weiter unten.
Die andere Einschränkung (für eine andere Tabelle) ist bereits aktiviert und vertrauenswürdig (aber wir können diese Tabelle/Einschränkung in diesem Artikel ignorieren).
Beispiel 2 – Aktivieren Sie die Beschränkungen mit WITH CHECK
Jetzt aktiviere ich alle Einschränkungen für den ConstraintTest
Tabelle:
ALTER TABLE ConstraintTest WITH CHECK CHECK CONSTRAINT ALL;
Das war’s – fertig.
Lassen Sie uns nun dieselbe Abfrage aus dem ersten Beispiel ausführen, um das Ergebnis anzuzeigen.
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;
Ergebnis:
+----------------+-----------------+---------------+------------------+ | Table | Constraint | is_disabled | is_not_trusted | |----------------+-----------------+---------------+------------------| | ConstraintTest | chkPrice | 0 | 0 | | ConstraintTest | chkValidEndDate | 0 | 0 | | ConstraintTest | chkTeamSize | 0 | 0 | | Occupation | chkJobTitle | 0 | 0 | +----------------+-----------------+---------------+------------------+
Alle drei Constraints für den ConstraintTest Tabelle sind jetzt aktiviert und vertrauenswürdig.
Sie sind vertrauenswürdig, weil ich WITH CHECK
verwendet habe in meiner aussage. Wenn ich das nicht getan hätte, hätte ich ein anderes Ergebnis erhalten, wie Sie unten sehen werden.
Durch die Verwendung von WITH CHECK
, kann ich sicher sein, dass alle vorhandenen Daten in der Tabelle tatsächlich den Einschränkungen entsprechen.
Beispiel 3 – Aktivieren Sie die Beschränkungen mit WITH NOCHECK
Jetzt werde ich die Einschränkungen mit WITH CHECK
wieder aktivieren damit wir sehen können, wie sich dies auf das Ergebnis auswirkt.
Aber zuerst muss ich sie deaktivieren:
ALTER TABLE ConstraintTest NOCHECK CONSTRAINT ALL;
Überprüfen Sie, ob sie deaktiviert sind:
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;
Ergebnis:
+----------------+-----------------+---------------+------------------+ | Table | Constraint | is_disabled | is_not_trusted | |----------------+-----------------+---------------+------------------| | ConstraintTest | chkPrice | 1 | 1 | | ConstraintTest | chkValidEndDate | 1 | 1 | | ConstraintTest | chkTeamSize | 1 | 1 | | Occupation | chkJobTitle | 0 | 0 | +----------------+-----------------+---------------+------------------+
Sie sind also wieder deaktiviert.
Aktivieren Sie sie jetzt wieder mit WITH NOCHECK
:
ALTER TABLE ConstraintTest WITH NOCHECK CHECK CONSTRAINT ALL;
Erneut prüfen:
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;
Ergebnis:
+----------------+-----------------+---------------+------------------+ | Table | Constraint | is_disabled | is_not_trusted | |----------------+-----------------+---------------+------------------| | ConstraintTest | chkPrice | 0 | 1 | | ConstraintTest | chkValidEndDate | 0 | 1 | | ConstraintTest | chkTeamSize | 0 | 1 | | Occupation | chkJobTitle | 0 | 0 | +----------------+-----------------+---------------+------------------+
Wir können sehen, dass die Einschränkungen erfolgreich aktiviert wurden, aber dieses Mal bleiben sie nicht vertrauenswürdig.
Die Einschränkungen sind nicht vertrauenswürdig, da sie keine vorhandenen Daten überprüft haben, bevor sie aktiviert wurden.
Der Schlüssel zum Mitnehmen hier ist also, wenn Sie möchten, dass Ihren Einschränkungen vertraut wird, verwenden Sie unbedingt WITH CHECK
beim Aktivieren.
Einschränkungen einzeln aktivieren
Wenn Sie nicht alle Beschränkungen auf einmal aktivieren möchten, können Sie sie einzeln aktivieren. Dies kann auch nützlich sein, wenn Sie alle Einschränkungen aktivieren müssen, aber andere Einstellungen verwenden müssen (z. B. WITH CHECK
für einige und WITH NOCHECK
für andere).
Siehe So aktivieren Sie eine CHECK-Einschränkung in SQL Server und So aktivieren Sie einen Fremdschlüssel in SQL Server.