Frage

Gibt es eine einfache Möglichkeit, eine Gruppe miteinander verbundener Tabellen in SQL Server zu löschen?Im Idealfall möchte ich mir keine Gedanken darüber machen müssen, in welcher Reihenfolge sie abgesetzt werden, da ich weiß, dass die gesamte Gruppe am Ende des Prozesses verschwunden sein wird.

War es hilfreich?

Lösung

Auch auf die Gefahr hin, dumm zu klingen: Ich glaube nicht, dass SQL Server die Lösch-/Kaskadensyntax unterstützt.Ich denke, Sie können eine Löschregel konfigurieren, um kaskadierende Löschvorgänge durchzuführen (http://msdn.microsoft.com/en-us/library/ms152507.aspx), aber soweit ich weiß, besteht der Trick bei SQL Server darin, die Drop-Abfrage einmal für jede Tabelle, die Sie löschen, auszuführen und dann zu überprüfen, ob sie funktioniert hat.

Andere Tipps

Ein anderer Ansatz könnte sein:Beseitigen Sie zunächst die Einschränkungen und lassen Sie dann die Tische mit einem einzigen Schlag fallen.

Mit anderen Worten, ein DROP CONSTRAINT für jede Einschränkung, dann ein DROP TABLE für jede Tabelle;Zu diesem Zeitpunkt sollte die Reihenfolge der Ausführung kein Problem darstellen.

Dies erfordert die sp___drop___constraints Das Skript finden Sie unter Datenbankjournal:

sp_MSforeachtable @command1="print 'disabling constraints: ?'", @command2="sp_drop_constraints @tablename=?"
GO
sp_MSforeachtable @command1="print 'dropping: ?'", @command2="DROP TABLE ?"
GO

NOTIZ Seien Sie also vorsichtig, wenn Sie ALLE Tabellen in Ihrer Datenbank löschen wollten

Ich habe keinen Zugriff auf SQL Server, um dies zu testen, aber wie wäre es mit:

DROP TABLE IF EXISTS table1, table2, table3 CASCADE;

Ich bin mir nicht sicher, ob Dereks Ansatz funktioniert.Sie haben es noch nicht als beste Antwort markiert.

Wenn nicht:Mit SQL Server 2005 sollte es möglich sein, denke ich.
Dort wurden Ausnahmen eingeführt (die ich noch nicht genutzt habe).Löschen Sie also die Tabelle, fangen Sie die Ausnahme ab, falls eine auftritt, und versuchen Sie es mit der nächsten Tabelle, bis alle verschwunden sind.
Sie können die Liste der Tabellen in einer temporären Tabelle speichern und sie bei Bedarf mit einem Cursor durchlaufen.

Am Ende habe ich Apache verwendet ddlutils um das Löschen für mich durchzuführen, was in meinem Fall das Problem gelöst hat, obwohl eine Lösung, die nur innerhalb von SQL Server funktionierte, um einiges einfacher wäre.

@Derek Park, ich wusste nicht, dass man dort getrennte Tabellen durch Komma setzen kann, das ist also praktisch, aber es scheint nicht ganz wie erwartet zu funktionieren.Weder IF EXISTS noch CASCADE werden anscheinend vom SQL Server erkannt und ausgeführt drop table X, Y, Z scheint nur zu funktionieren, wenn sie in der angegebenen Reihenfolge gelöscht werden sollten.

Siehe auch http://msdn.microsoft.com/en-us/library/ms173790.aspx, das die Drop-Table-Syntax beschreibt.

Was Sie davon abhält, die Tabellen in beliebiger Reihenfolge zu löschen, sind Fremdschlüsselabhängigkeiten zwischen den Tabellen.Befreien Sie sich also von den FKs, bevor Sie beginnen.

  1. Rufen Sie mithilfe der Systemansichten INFORMATION_SCHEMA eine Liste aller Fremdschlüssel ab, die sich auf eine dieser Tabellen beziehen
  2. Löschen Sie jeden dieser Fremdschlüssel
  3. Jetzt sollten Sie in der Lage sein, alle Tabellen in beliebiger Reihenfolge zu löschen.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top