Suchen...
Generic filters
Exact matches only
Search in title
Search in excerpt
Search in content

Restore und Einspielen von Change Skripten - Die Entwicklungsumgebung automatisch aktualisieren

Wenn man größere Datenbanken hat, kann es durchaus vorkommen, das mehrere Leute an derselben Datenbank arbeiten, mit mehrfachen Kopien und Entwicklungsumgebungen. Zwischen diesen Datenbanken kommt es von Natur aus sehr schnell zu Schiefständen, was sowohl die Daten selbst als auch die Struktur angeht. Arbeiten zum Beispiel zwei Personen am selben Datenbankobjekt, kann es sein, dass dies erst viel zu spät auffällt, nämlich erst wenn das Ergebnis auf die produktive Datenbank übertragen werden soll und einer von beiden Prozessen nicht mehr funktioniert.

In diesem Blog wird gezeigt wie mit zwei einfachen Mitteln diese Situation umgangen werden kann. Das Erste sind die On-Board Mittel von Microsoft SSIS, welche als erstes unter die Lupe genommen werden sollen. Das Zweite, und gerade am Anfang sicherlich deutlich schwierigere, ist das konsequente und saubere Arbeiten mit Change Skript, also den Skripten, in welchen die zu ändernden oder erstellenden Objekte in SQL beschrieben sind.

Das SSIS Paket

In der folgenden Abbildung wird das SSIS-Paket und seine einzelnen Komponenten erklärt:


Abbildung 1 – Gesamtaufbau des SSIS Paketes

Datenbank sichern

In diesem Schritt wird ein Backup der aktuell produktiven Datenbank erzeugt und als Datei auf einer lokalen Festplatte abgelegt. Der Speicherort lässt sich beliebig anpassen und auch eine Speicherung in einem Azure Blob Storage wäre denkbar.


Abbildung 2 – Definition des Datenbank Backups

Über die unterschiedlichen Arten des Backups habe ich in bereits einen Blogbeitrag geschrieben.
Für den vorliegenden Fall benötigen wir ein vollständiges Backup, weswegen sich ein SSIS Baustein anbietet.
Zunächst wird aus der SSIS Toolbox der Task „Datenbank sichern gewählt“.


Abbildung 3 – Auswählen des Datenbank Backup Tasks

Diesen konfigurieren wir für eine bestimmte Datenbank und das Sichern auf die Festplatte


Abbildung 4 – Konfiguration des Backups

Da ohne weitere Einstellungen das SSIS Paket einen Zeitstempel an die Datei anhängen würde, und wir diese nicht ohne weiteres in kommenden Schritten auswählen könnten, wird ein fixer Name vergeben.
Wichtiger Hinweis: Der gezeigte Prozess sollte keinesfalls als Ersatz für eine solide Backupstrategie angesehen werden!
Zudem wird dem Task noch mitgegeben, dass er eventuell vorhandene Sicherungsdateien überschreiben soll.


Abbildung 5 – Konfiguration des Backupzieles

Als letzter, zwar optionaler, aber aus meiner Sicht zu empfehlender Punkt wird das Paket noch so eingestellt, dass die erzeugte Datei komprimiert wird, um Speicherplatz zu sparen.


Abbildung 6 – Komprimierung der Backup Datei

Datenbank löschen

In diesem Schritt wird die vorhandene Entwicklungsdatenbank gelöscht.


Abbildung 7 – Löschen der aktuellen Entwicklungsumgebung

Um sicherzustellen, dass die Datenbank auch gelöscht werden kann und nicht noch aktive Verbindungen offen sind, werden vor dem Löschen alle Verbindungen beendet. Dies lässt sich mit dem eigentlichen Löschbefehl in einem SQL kombinieren.

Lediglich der Name der Entwicklungsdatenbank muss in diesem Skript noch angepasst werden.

Datenbank wiederherstellen

Nachdem nun erfolgreich die produktive Datenbank gesichert und die Entwicklungsdatenbank gelöscht wurde, kann das aktuelle Backup an der Stelle der Entwicklungsdatenbank wiederhergestellt werden.

Hierbei muss darauf geachtet werden, dass der Dateiname sowohl für die Logs als auch die Datenbankdateien angepasst werden muss.

ImportID erzeugen und auslesen

Damit in einer späteren Übersicht nachvollzogen werden kann wann ggf. Fehler auftreten, wird eine ID erzeugt, welche für die Imports eindeutig ist.
Bevor eine ReportingID erzeugt werden kann, ein kurzer Auflug in das Logging und späteres Reporting, für welches eine neue Datenbank angelegt werden muss. Diese soll den Namen „SSIS_Logging_Database“ tragen. (Das Skript zur Erzeugung der Datenbank befindet sich im Anhang).
Für das Logging der Datenbank und auch das spätere Reporting werden Informationen aus dem SSIS Paket in die neu angelegte SQL-Datenbank geschrieben.


Abbildung 8 – Konfiguration des SSIS Loggings

Eine genauere Anleitung hat meine Kollege Hr. Werther geschrieben:
https://www.bissantz.de/know-how/crew/ssis-logging-in-deltamaster/


Abbildung 9 – Erzeugen und Auslesen der ImportID

An dieser Stelle sollen die SSIS Variablen für dieses Paket eingeführt werden.
(Siehe Anhang SSIS Variablen)
Diese werden an der jeweils benötigten Stelle noch einmal näher in den Fokus gerückt.
Um die ImportID zu erzeugen, wird ein neuer Eintrag in die Tabelle T_Config_ImportID erzeugt.

Anschließend wird die maximale ImportID wieder ausgelesen, um sie im Weiteren zu verwenden.

Damit die Ergebnisse im SSIS Paket korrket übernommen werden sind noch 2 kleine Einstellungen bzw. Zuweisungen nötig.


Abbildung 10 – Konfiguration des ResultSets


Abbildung 11 – Zuweisung des ResultSets zur Variablen

Exkurs: Struktur der Change Skripte

Damit im Folgenden das Einspielen der Skripte und auch das hierauf aufbauende Reporting korrekt funktioniert, ist eine stringente Benennung der Dateien notwendig; ebenso, dass pro Skript nur ein Objekt geändert wird. Die Benennung findet anhand der Folgenden Regel statt:
Skriptnummer – Projekt/System – Ersteller -Objektname – Beschreibung
Beispiel: 0001 – OM – WGN – V_FACT_Test – Create VIEW
Auf Basis dieser Regel wird ein Großteil der Variablen gesetzt.

Einspielen der Change Skripte

Im letzten Schritt werden die im definierten Ordner abgelegten Change Skripte eingelesen und auf der Datenbank ausgeführt.


Abbildung 12 – ForEach Loop zum einlesen der Skripte

Dies wird erreicht, indem die Quelle für den SQL-Task eine Datenverbindung aufweist, und keine Variable oder Text verwendet.


Abbildung 13 – Konfiguration der SQL-Anweisung

Neben dem Skript, welches ausgeführt wird, wird auch das Logging in die Datenbank geschrieben. Dies wird über die Variable SQL erreicht.


Abbildung 14 – Einfügen des Logging Datensatzes

Ist das Skript erfolgreich, wird es in den Ordner Tested verschoben. Treten während des Ausführens Fehler auf, wird es in den Ordner Failed verschoben. Tritt ein Fehler auf, so würde im Normalfall das ganze Paket mit einem Fehler abbrechen. Um dies zu vermeiden erfordert es noch einen letzten Konfigurationsschritt. Hierfür werden die Eigenschaften des Loop Containers angepasst.


Abbildung 15 – Konfiguration des Failovers

Mit der Einstellung ForceExcecutionResult = Success, wird erreicht das das Paket auch dann weiterläuft, wenn es zu einem „erwartetem“ Fehler kommt.


Abbildung 16 – Forced Success für Task

Zusammenfassung

In diesem Blog wurde aufgezeigt, wie man mit Changeskripten und on Boardmitteln von Microsoft (SSIS) aus der aktuellen produktiven Datenbank eine Testumgebung mit allen geänderten Objekten aufbauen kann.

Anhang

SSIS Logging Datenbank

 






SSIS Variablen