Ich habe eine Testumgebung für eine Datenbank, die ich zu Beginn eines Testzyklus mit neuen Daten neu laden möchte. Ich bin nicht daran interessiert, die gesamte Datenbank neu zu erstellen - einfach die Daten "neu einzustellen".
Was ist der beste Weg, um alle Daten mit TSQL aus allen Tabellen zu entfernen? Gibt es gespeicherte Systemprozeduren, Ansichten usw., die verwendet werden können? Ich möchte nicht manuell abgeschnittene Tabellenanweisungen für jede Tabelle erstellen und verwalten. Ich würde es vorziehen, wenn sie dynamisch ist.
sql-server
tsql
Strahl
quelle
quelle
Beim Löschen von Daten aus Tabellen mit Fremdschlüsselbeziehungen - was im Grunde bei jeder ordnungsgemäß gestalteten Datenbank der Fall ist - können wir alle Einschränkungen deaktivieren, alle Daten löschen und dann die Einschränkungen wieder aktivieren
Weitere Informationen zum Deaktivieren von Einschränkungen und Triggern finden Sie hier
Wenn einige der Tabellen Identitätsspalten haben, möchten wir sie möglicherweise neu setzen
Beachten Sie, dass sich das Verhalten von RESEED zwischen einer brandneuen Tabelle und einer Tabelle unterscheidet, in die zuvor einige Daten aus BOL eingefügt wurden :
Dank an Robert für den Hinweis, dass das Deaktivieren von Einschränkungen das Abschneiden nicht zulässt, müssten die Einschränkungen gelöscht und dann neu erstellt werden
quelle
SET ROWCOUNT 0
am Anfang Ihres Skripts hinzufügen, da die Aktionen standardmäßig auf 500 Zeilen beschränkt sind! Sie erhalten frustrierende Fehler wie ich, weil nicht alle Daten tatsächlich gelöscht wurden.Hier ist der König der Datenbank-Löschskripte. Es werden alle Tabellen gelöscht und korrekt neu gesetzt:
Viel Spaß, aber sei vorsichtig!
quelle
SET QUOTED_IDENTITY OFF
in seinem Hauptteil ( Link ) hat. UPDATE: Das Update besteht darin, "SET QUOTED_IDENTIFIERS on" hinzuzufügen. zum Anfang jeder Aussage, die diesen FehlerDer einfachste Weg, dies zu tun, ist zu
Auf diese Weise erhalten Sie ein Skript, das alle Ihre Tabellen löscht und neu erstellt, ohne sich um das Debuggen kümmern zu müssen oder ob Sie alles eingeschlossen haben. Dies führt zwar mehr als nur ein Abschneiden aus, die Ergebnisse sind jedoch dieselben. Denken Sie daran, dass Ihre automatisch inkrementierenden Primärschlüssel bei 0 beginnen, im Gegensatz zu abgeschnittenen Tabellen, die sich an den zuletzt zugewiesenen Wert erinnern. Sie können dies auch über Code ausführen, wenn Sie in Ihren PreProd- oder Produktionsumgebungen keinen Zugriff auf Management Studio haben.
1.
2.
3.
quelle
Das Abschneiden aller Tabellen funktioniert nur, wenn Sie keine Fremdschlüsselbeziehungen zwischen Ihren Tabellen haben, da Sie mit SQL Server keine Tabelle mit einem Fremdschlüssel abschneiden können.
Eine Alternative dazu besteht darin, die Tabellen mit Fremdschlüsseln zu ermitteln und zuerst aus diesen zu löschen. Anschließend können Sie die Tabellen ohne Fremdschlüssel abschneiden.
Weitere Informationen finden Sie unter http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=65341 und http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=72957 .
quelle
Eine alternative Option, die ich gerne mit MSSQL Server Deveploper oder Enterprise verwende, besteht darin, unmittelbar nach dem Erstellen des leeren Schemas einen Snapshot der Datenbank zu erstellen. An diesem Punkt können Sie die Datenbank einfach wieder auf den Snapshot zurücksetzen.
quelle
Tu das nicht! Wirklich keine gute Idee.
Wenn Sie wissen, welche Tabellen Sie abschneiden möchten, erstellen Sie eine gespeicherte Prozedur, die sie abschneidet. Sie können die Bestellung korrigieren, um Fremdschlüsselprobleme zu vermeiden.
Wenn Sie wirklich alle abschneiden möchten (damit Sie sie beispielsweise von BCP laden können), können Sie die Datenbank genauso schnell löschen und eine neue von Grund auf neu erstellen. Dies hat den zusätzlichen Vorteil, dass Sie genau wissen, wo Sie sich befinden.
quelle
Wenn Sie Daten in einer bestimmten Tabelle (dh einer statischen Nachschlagetabelle) behalten möchten, während Sie Daten in anderen Tabellen innerhalb derselben Datenbank löschen / abschneiden, benötigen Sie eine Schleife mit den darin enthaltenen Ausnahmen. Das habe ich gesucht, als ich auf diese Frage gestoßen bin.
sp_MSForEachTable scheint mir fehlerhaft zu sein (dh inkonsistentes Verhalten mit IF-Anweisungen), weshalb es wahrscheinlich von MS nicht dokumentiert ist.
quelle
Der schwierigste Teil beim Abschneiden aller Tabellen besteht darin, die Fremdschlüsseleinschränkungen zu entfernen und erneut hinzuzufügen.
Die folgende Abfrage erstellt die drop & create-Anweisungen für jede Einschränkung, die sich auf jeden Tabellennamen in @myTempTable bezieht. Wenn Sie diese für alle Tabellen generieren möchten, können Sie stattdessen einfach das Informationsschema verwenden, um diese Tabellennamen zu erfassen.
Ich kopiere dann einfach die auszuführenden Anweisungen aus - aber mit ein wenig Entwicklungsaufwand könnten Sie einen Cursor verwenden, um sie dynamisch auszuführen.
quelle
Es ist viel einfacher (und möglicherweise sogar noch schneller), Ihre Datenbank zu skripten, sie dann einfach zu löschen und aus dem Skript zu erstellen.
quelle
Erstellen Sie eine leere "Vorlagendatenbank" und erstellen Sie eine vollständige Sicherung. Wenn Sie eine Aktualisierung benötigen, stellen Sie diese einfach mit WITH REPLACE wieder her. Schnell, einfach, kugelsicher. Und wenn einige Tabellen hier oder da einige Basisdaten benötigen (z. B. Konfigurationsinformationen oder nur grundlegende Informationen, die Ihre App zum Laufen bringen), wird dies auch behandelt.
quelle
Dies ist einer Möglichkeit, dies zu tun ... es gibt wahrscheinlich 10 andere, die besser / effizienter sind, aber es hört sich so an, als ob dies sehr selten gemacht wird.
Holen Sie sich eine Liste der
tables
vonsysobjects
, dann durchlaufen Sie diese mit einem Cursor und rufen Siesp_execsql('truncate table ' + @table_name)
für jede aufiteration
.quelle
Führen Sie den auskommentierten Abschnitt einmal aus, füllen Sie die Tabelle _TruncateList mit den Tabellen, die abgeschnitten werden sollen, und führen Sie dann den Rest des Skripts aus. Die _ScriptLog-Tabelle muss im Laufe der Zeit bereinigt werden, wenn Sie dies häufig tun.
Sie können dies ändern, wenn Sie alle Tabellen erstellen möchten. Geben Sie einfach den Namen SELECT in #TruncateList FROM sys.tables ein. Normalerweise möchten Sie jedoch nicht alle ausführen.
Dies wirkt sich auch auf alle Fremdschlüssel in der Datenbank aus, und Sie können dies auch ändern, wenn es für Ihre Anwendung zu stumpf ist. Es ist nicht für meine Zwecke.
quelle
Ich verstehe nicht, warum das Löschen von Daten besser wäre als ein Skript zum Löschen und Neuerstellen jeder Tabelle.
Das oder sichern Sie Ihre leere Datenbank und stellen Sie sie über der alten wieder her
quelle
Bevor Sie die Tabellen abschneiden, müssen Sie alle Fremdschlüssel entfernen. Verwenden Sie dieses Skript , um endgültige Skripte zum Löschen und Neuerstellen aller Fremdschlüssel in der Datenbank zu generieren. Bitte setzen Sie die Variable @action auf 'CREATE' oder 'DROP'.
quelle
Wählen Sie 'Löschen aus' + TABLE_NAME aus INFORMATION_SCHEMA.TABLES, wobei TABLE_TYPE = 'BASE TABLE'
Woher kommt das Ergebnis?
Kopieren Sie das Abfragefenster, fügen Sie es ein und führen Sie den Befehl aus
quelle
Es ist etwas spät, aber es könnte jemandem helfen. Ich habe manchmal eine Prozedur erstellt, die mit T-SQL Folgendes ausführt:
Ich habe es auf meinem Blog aufgeführt hier
quelle