Code & Queries

Code & Queries: Your Source for SQL, Python, and AI Insights

In SQL Server können Sie Constraints temporär deaktivieren oder komplett entfernen, um beispielsweise Massendatenimporte durchzuführen oder Tabellenstrukturen anzupassen. Nach Abschluss der Änderungen können Sie die Constraints wieder aktivieren oder neu setzen. Dies ist insbesondere nützlich in Szenarien wie Bulk-Imports, Datenmigrationen oder Wartungsarbeiten.

In diesem Artikel zeigen wir Ihnen, wie Sie Constraints aufheben (deaktivieren) und wieder neu setzen oder erneut aktivieren können.


1. Constraints vorübergehend deaktivieren

Wenn Sie Constraints nur vorübergehend deaktivieren möchten, ohne sie vollständig zu entfernen, können Sie dies für CHECK- und FOREIGN KEY-Constraints tun. Beachten Sie, dass PRIMARY KEY-, UNIQUE- und NOT NULL-Constraints nicht deaktiviert werden können – diese müssen stattdessen geändert oder entfernt werden.

a) Foreign Key Constraints deaktivieren

Um Foreign Key Constraints für eine Tabelle zu deaktivieren, verwenden Sie folgenden Befehl:

ALTER TABLE TableName NOCHECK CONSTRAINT ALL;

Dies deaktiviert alle Foreign Key Constraints für die angegebene Tabelle. Wenn Sie einen bestimmten Constraint deaktivieren möchten, geben Sie den Namen des Constraints an:

ALTER TABLE TableName NOCHECK CONSTRAINT FK_ConstraintName;

Beispiel:

ALTER TABLE FactSales NOCHECK CONSTRAINT FK_FactSales_DimProduct;

b) Check Constraints deaktivieren

Ähnlich wie bei Foreign Keys können Sie auch Check Constraints deaktivieren:

ALTER TABLE TableName NOCHECK CONSTRAINT CK_ConstraintName;

Beispiel:

ALTER TABLE FactSales NOCHECK CONSTRAINT CK_Quantity;

2. Constraints wieder aktivieren

Nachdem Sie Ihre Daten bearbeitet haben, können Sie die Constraints wieder aktivieren.

a) Foreign Key Constraints aktivieren

Um alle Foreign Key Constraints einer Tabelle wieder zu aktivieren, verwenden Sie:

ALTER TABLE TableName CHECK CONSTRAINT ALL;

Für einen bestimmten Constraint:

ALTER TABLE TableName CHECK CONSTRAINT FK_ConstraintName;

Beispiel:

ALTER TABLE FactSales CHECK CONSTRAINT FK_FactSales_DimProduct;

b) Check Constraints aktivieren

Genauso wie bei Foreign Keys können Sie Check Constraints wieder aktivieren:

ALTER TABLE TableName CHECK CONSTRAINT CK_ConstraintName;

Beispiel:

ALTER TABLE FactSales CHECK CONSTRAINT CK_Quantity;

3. Constraints vollständig entfernen und neu erstellen

Wenn Sie Constraints dauerhaft entfernen möchten oder sie ändern müssen, können Sie sie zunächst löschen und dann neu erstellen.

a) Constraint entfernen

Verwenden Sie den folgenden Befehl, um einen Constraint zu entfernen:

ALTER TABLE TableName DROP CONSTRAINT ConstraintName;

Beispiel:

ALTER TABLE FactSales DROP CONSTRAINT FK_FactSales_DimProduct;

b) Constraint neu erstellen

Nach dem Entfernen können Sie den Constraint mit neuen Parametern neu erstellen:

ALTER TABLE TableName ADD CONSTRAINT ConstraintName ConstraintType (Column);

Beispiel:

Neu erstellen eines Foreign Key Constraints:

ALTER TABLE FactSales
ADD CONSTRAINT FK_FactSales_DimProduct FOREIGN KEY (ProductKey) REFERENCES DimProduct(ProductKey);

Neu erstellen eines Check Constraints:

ALTER TABLE FactSales
ADD CONSTRAINT CK_Quantity CHECK (Quantity >= 0);

4. Massendatenimport mit deaktivierten Constraints

Bei Massendatenimports ist es oft sinnvoll, Constraints vorübergehend zu deaktivieren, um die Leistung zu optimieren. Hier ein praktisches Beispiel:

Schritt-für-Schritt-Anleitung:

  1. Constraints deaktivieren:

    ALTER TABLE FactSales NOCHECK CONSTRAINT ALL;
    
  2. Daten importieren: Verwenden Sie beispielsweise den BULK INSERT-Befehl oder andere Importmethoden:

    BULK INSERT FactSales
    FROM 'C:\Data\sales_data.csv'
    WITH (
       FIELDTERMINATOR = ',',
       ROWTERMINATOR = '\n'
    );
    
  3. Constraints wieder aktivieren:

    ALTER TABLE FactSales CHECK CONSTRAINT ALL;
    
  4. Validierung durchführen: Überprüfen Sie nach dem Import, ob die Constraints korrekt funktionieren:

    DBCC CHECKCONSTRAINTS ('FactSales');
    

5. Automatisierte Skripte für Constraints

Für größere Tabellen oder komplexere Datenbanken kann es hilfreich sein, automatisierte Skripte zu schreiben, die Constraints vorübergehend deaktivieren und anschließend wieder aktivieren.

Beispiel: Automatisches Deaktivieren und Aktivieren aller Constraints

Deaktivieren aller Constraints in einer Datenbank:

DECLARE @sql NVARCHAR(MAX) = '';

SELECT @sql += 'ALTER TABLE [' + SCHEMA_NAME(schema_id) + '].[' + OBJECT_NAME(parent_object_id) 
               + '] NOCHECK CONSTRAINT [' + name + '];' + CHAR(13)
FROM sys.foreign_keys;

EXEC sp_executesql @sql;

Aktivieren aller Constraints in einer Datenbank:

DECLARE @sql NVARCHAR(MAX) = '';

SELECT @sql += 'ALTER TABLE [' + SCHEMA_NAME(schema_id) + '].[' + OBJECT_NAME(parent_object_id) 
               + '] CHECK CONSTRAINT [' + name + '];' + CHAR(13)
FROM sys.foreign_keys;

EXEC sp_executesql @sql;

6. Hinweise und Best Practices

  • Backup: Bevor Sie Constraints deaktivieren oder entfernen, erstellen Sie immer ein Backup Ihrer Datenbank.
  • Testen: Testen Sie die Constraints nach dem Neusetzen, um sicherzustellen, dass sie korrekt funktionieren.
  • Leistung: Deaktivieren Sie Constraints nur, wenn es absolut notwendig ist, da dies die Datenintegrität beeinträchtigen kann.
  • DBCC CHECKCONSTRAINTS: Verwenden Sie den Befehl DBCC CHECKCONSTRAINTS, um sicherzustellen, dass keine verletzten Constraints vorhanden sind.

Fazit

Das Aufheben und Neusetzen von Constraints ist ein wichtiges Werkzeug in SQL Server, insbesondere bei Massendatenoperationen oder Strukturänderungen. Durch das vorübergehende Deaktivieren von Constraints können Sie die Leistung optimieren, während Sie gleichzeitig die Datenintegrität gewährleisten, indem Sie die Constraints nach Abschluss der Operationen wieder aktivieren oder neu setzen.