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

So aktivieren Sie alle CHECK- und Fremdschlüsseleinschränkungen für eine Tabelle in SQL Server (T-SQL-Beispiele)

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.