Ich versuche, eine Methode zum Arbeiten mit einer Testdatenbank (in SQL Server) für unsere Integrationstests zu definieren.
Meine Idee war, diese Schritte beim Start der Integrationstest-Assembly auszuführen:
- Erstellen Sie eine völlig leere Datenbank
- Führen Sie das Skript "Datenbankobjekte erstellen" aus, um alle relevanten Datenbankobjekte (Tabellen, Ansichten, Sequenzen usw.) zu erstellen.
- Füllen Sie die "Basisdaten" (Nachschlagewerte usw.)
- Erstellen Sie einen Datenbank-Snapshot, der
(db)_Basis
als "Basislinie" für zukünftige Integrationstests bezeichnet wird
Jetzt plante ich vor jeder Testklasse (die 1-n-Tests enthielt) einfach eine "Wiederherstellung aus dem Snapshot", um wieder in den gut definierten, mehr oder weniger "leeren" Zustand der Datenbank zu gelangen. Funktioniert bisher wie ein Zauber.
Es gibt jedoch eine Reihe von Integrationstests, die auf einer großen Testdatenbank ausgeführt werden müssen. Daher hatte ich die Hoffnung, dies vor jedem dieser Testgeräte zu tun (Klassen mit n Einzeltests).
- Datenbank aus dem
(db)_Basis
Snapshot wiederherstellen - Fügen Sie diese über 50'000 Datenzeilen in die Datenbank ein
- Erstellen Sie einen weiteren
(db)_With_Testdata
Schnappschuss
Setzen Sie dann für jeden Test die Datenbank auf die gut definierte (db)_With_Testdata
Snapshot-Version zurück, führen Sie die Tests aus, überprüfen Sie das Ergebnis und so weiter.
Das Problem ist, dass anscheinend nicht zwei Datenbank-Snapshots gleichzeitig vorhanden sind. Wenn dies der Fall ist, kann keine der beiden Datenbanken wiederhergestellt werden. Es wird immer wieder der folgende Fehler angezeigt:
Meldung 3137, Ebene 16, Status 4, Zeile 9 Die
Datenbank kann nicht zurückgesetzt werden. Entweder der primäre Name oder der Name des Snapshots sind falsch angegeben, alle anderen Snapshots wurden nicht gelöscht oder es fehlen Dateien.Meldung 3013, Ebene 16, Status 1, Zeile 9
DATENBANK WIEDERHERSTELLEN wird abnormal beendet.
Funktionieren SQL Server-Datenbank-Snapshots wirklich so? Scheint schrecklich einschränkend ..... Ich würde verstehen, wenn ich nicht direkt zum ursprünglichen "(db) _Basis" -Snapshot zurückkehren könnte - aber nur, weil ich jetzt zwei Snapshots habe, kann ich nicht einmal zum neuesten zurückkehren ?!?!?
quelle
Antworten:
Leider ist es beabsichtigt.
Entnommen aus der BOL-Seite " Datenbank auf einen Datenbank-Snapshot zurücksetzen ":
Alternativ können Sie den ersten Schnappschuss ablegen
(db)_Basis
. Ich kann verstehen, dass dies sehr einschränkend zu sein scheint, aber sehen Sie es so: Schnappschüsse sind spärliche Dateien, die auf den ursprünglichen Datendateien basieren, so dass das Zurücksetzen auf einen bestimmten Schnappschuss sowieso alle Schnappschüsse ungültig machen würde (die Basisdatendateien würden durch den Zurücksetzungsvorgang geändert). . Die Einschränkung kann ärgerlich sein, sieht aber nicht unangemessen aus.quelle
Eine andere Perspektive besteht darin, Backups zu erstellen und wiederherzustellen , da Sie lediglich eine leere Datenbank und ein leeres Schema mit einigen Suchwerten erstellen.
Außerdem ist die Datenbank beim Einfügen von 50.000 Zeilen nicht so groß. Wenn Sie die Komprimierung verwenden, verringert sich auch die Sicherungsgröße.
Sie können einen TSQL-Agenten-Job oder nur Skripte haben (möglicherweise können Sie eine gespeicherte Prozedur erstellen und diese nach Ihren Tests auf der Grundlage der erhaltenen Ausgabe aufrufen).
(db)_Basis
(db)_With_Testdata
Wenn Ihre Integrationsskripts ausgeführt werden und die endgültige Ausgabe vorliegt, können Sie einen der oben genannten Jobs ausführen, um zu dem gewünschten Zeitpunkt zurückzukehren.
Ich bin der Meinung, dass die Sicherungs- / Wiederherstellungsmethode in Ihrem Szenario sehr elegant ist, da Sie die Beschränkung für Datenbank-Snapshots treffen . Außerdem hat Paul Randal über einen bösen Fehler in allen Versionen bis einschließlich SQL Server 2012 gebloggt (nicht sicher, ob er in einer späteren CU behoben wurde).
quelle