Wie können Fremdschlüssel-Beschränkungen mit T-SQL vorübergehend deaktiviert werden?

Wird das Deaktivieren und Aktivieren von Fremdschlüssel-Beschränkungen in SQL Server unterstützt? Oder besteht meine einzige Möglichkeit darin, die Beschränkungen zu löschen und dann neu zu erstellen`?

Lösung

Wenn Sie alle Beschränkungen in der Datenbank deaktivieren möchten, führen Sie einfach diesen Code aus:

-- disable all constraints
EXEC sp_MSforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

Um sie wieder einzuschalten, führen Sie aus: (der Ausdruck ist natürlich optional und listet nur die Tabellen auf)

-- enable all constraints
exec sp_MSforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"

Ich finde es nützlich, wenn ich Daten von einer Datenbank in eine andere übertrage. Es ist ein viel besserer Ansatz als das Fallenlassen von Beschränkungen. Wie Sie bereits erwähnt haben, ist es sehr nützlich, wenn alle Daten in der Datenbank gelöscht und neu aufgefüllt werden (z. B. in einer Testumgebung).

Wenn Sie alle Daten löschen möchten, ist vielleicht diese Lösung hilfreich.

Manchmal ist es auch praktisch, alle Trigger zu deaktivieren. Die vollständige Lösung finden Sie hier.

Kommentare (21)

http://www.sqljunkies.com/WebLog/roman/archive/2005/01/30/7037.aspx

-- Disable all table constraints

ALTER TABLE MyTable NOCHECK CONSTRAINT ALL

-- Enable all table constraints

ALTER TABLE MyTable WITH CHECK CHECK CONSTRAINT ALL

-- Disable single constraint

ALTER TABLE MyTable NOCHECK CONSTRAINT MyConstraint

-- Enable single constraint

ALTER TABLE MyTable WITH CHECK CHECK CONSTRAINT MyConstraint
Kommentare (8)

Nach dem SQL-92-Standard kann eine Konstante als DEFERRABLE deklariert werden, so dass sie im Rahmen einer Transaktion (implizit oder explizit) verschoben werden kann. Leider fehlt diese SQL-92-Funktionalität in SQL Server noch immer.

Für mich ist das Ändern einer Einschränkung in NOCHECK gleichbedeutend mit dem Ändern der Datenbankstruktur im Handumdrehen - das Fallenlassen von Einschränkungen ist es auf jeden Fall - und etwas, das man vermeiden sollte (z. B. wenn Benutzer erhöhte Berechtigungen benötigen).

Kommentare (0)