Ich möchte alle Standardeinschränkungen, Prüfeinschränkungen, eindeutigen Einschränkungen, Primärschlüssel und Fremdschlüssel aus allen Tabellen in einer SQL Server-Datenbank löschen. Ich weiß, wie ich alle Einschränkungsnamen abrufen kann sys.objects
, aber wie fülle ich das ALTER TABLE
Teil auf?
sql-server
ddl
constraint
Aaron Bertrand
quelle
quelle
Antworten:
Sie können diese Informationen einfach ableiten, indem Sie sie
sys.tables.object_id = sys.objects.parent_object_id
für diese Objekttypen verbinden.PRINT
ist nur zum Anschauen da - wenn Sie viele Einschränkungen haben, wird möglicherweise nicht das gesamte Skript angezeigt, da es auf 8 KB beschränkt ist. In diesen Fällen finden Sie in diesem Tipp weitere Möglichkeiten zum Überprüfen des Skripts vor dem Ausführen.Wenn Sie mit der Ausgabe zufrieden sind, entfernen Sie das Kommentarzeichen
EXEC
.quelle
ORDER BY (CASE WHEN c.[type] IN ('PK', 'UQ') THEN 1 ELSE 0 END)
Ich begann mit der akzeptierten Antwort und änderte die Struktur, um eine while-Schleife zu verwenden, anstatt die vollständige SQL-Anweisung in Dynamic SQL zu erstellen. Ich mag das aus mehreren Gründen besser.
Die Abfrage wird nicht in der großen Variablen @sql gespeichert. Diese Implementierung ermöglicht einen Druck für jede Einschränkung, die zu Protokollierungszwecken in der Ausgabe gelöscht wird. Die Ausführung schien in meinen Unit-Tests etwas schneller zu sein.
quelle