Wie stelle ich meine Datenbank unter Versionskontrolle?

Ein Artikel von Jasmin Fluri, Consultant, Diso AG

Im Artikel „Externe Datenbanken verwenden mit Bitbucket Pipelines“ erklärte meine Kollegin Valentina Lanz das Vorgehen, wie Datenbanken in der Delivery Pipeline verwendet werden. Die Voraussetzung hierzu ist, dass auch der Datenbankcode unter Versionskontrolle liegt. Denn ein häufig anzutreffendes Szenario ist: Die Applikation, welche weiterentwickelt werden soll, steht unter Versionskontrolle, jedoch nicht die dazugehörige Datenbank. Dieser Artikel zeigt in 6 einfachen Schritten, wie der gesamte Code (Datenbank und Applikation) unter Versionskontrolle gesetzt wird und was dazu notwendig ist.

Die Datenbank oder der Datenspeicher sind zentrale Elemente einer Applikation. Eine Version der Datenbank entspricht immer auch einer Version der Applikation. Diese müssen zusammen deployed werden, damit die Funktionalität der Applikation gewährleistet ist. Oft wird dies mit sorgfältiger Planung der Releases sichergestellt. Jeder Beteiligte weiss, wann er welches Script ausführen muss und welche Dinge er zu erledigen hat. Aber geht denn das nicht auch einfacher und mit weniger möglicher Fehlerquellen?

Versionskontrolle durch automatische Datenbankmigrationen

Software Releases sollen auch für Datenbanken einfach durchzuführen sein. Hierzu wurden Datenbank-Migrationstools erfunden, welche es ermöglichen, beim Build der Applikation auf die neuste Version der Datenbank zu migrieren – und das ganz ohne manuelle Eingriffe. Deshalb muss der Datenbank-Quellcode unter den selben strengen Richtlinien der Quellcodeverwaltung liegen wie die Applikation. Doch wie gelingt das, wenn aktuell noch alle Datenbankänderungen manuell deployed werden? Und welche Technologien eignen sich dafür? Dies wird in den folgenden sechs Schritten erklärt:

1. Baseline erstellen

Wenn die Datenbank schon existiert und nicht neu aufgebaut wird, muss zuerst eine Baseline erstellt werden. Diese Baseline bildet einen aktuellen Snapshot von allen Elementen in der Datenbank ab. Hier unterscheidet man zwischen einmalig ausführbaren Elementen und Elementen, welche sich mehrmals ausführen lassen. Wir sehen später, wieso dies relevant ist.

2. Elemente strukturieren und integrieren

Eine Strukturierung der erstellten Elemente ist unablässig, wenn sie in eine bestehende Verzeichnisstruktur eines Entwicklungsprojektes integriert werden sollen. Es empfiehlt sich zur besseren Übersicht in der Verzeichnisstruktur nach einmalig ausführbaren und mehrmalig ausführbaren Elementen der Datenbank zu unterscheiden.

Einmalig ausführbare Elemente können wie der Name schon sagt nur einmal auf der Datenbank abgelegt werden. Datenbank-Migrationstools haben die Funktionalität eingebaut, dass sie sich bei einmalig ausführbaren Elementen die Version merken und nur neue Änderungen auf die Datenbank deployen. Einmalig ausführbare Elemente sind:
– CREATE / ALTER / DROP von  Tabellen, Indexen, Foreign Keys, Enums, etc.
– Updates von Daten / Datenkorrekturen

Mehrmalig ausführbare Elemente können beliebig oft auf die Datenbank deployed werden, ohne dass Fehlermeldungen entstehen. Sie werden meist einfach aktualisiert. Auch diese Funktionalität ist in Datenbank-Migrationstools schon vorhanden. Mehrmalig ausführbare Elemente sind:
– (Re-)CREATE von Views, Prozeduren, Funktionen, Packages (bedingt „create or replace“- Klausel)
– Wiederholbare Datenloads

Je nach Menge der mehrmalig ausführbaren Elementen lohnt es sich, diese zusätzlich nach Typ zu strukturieren.

3. Deployment automatisieren

Nachdem alle Datenbankelemente in der selben Struktur abgelegt sind, ist es möglich, das Deployment zu automatisieren. Hierzu gibt es bewährte Datenbankmigrationstools wie Flyway, Liquibase oder myBatis Migrations. Sie können entweder über das Build Tool der Applikation angesprochen werden (Maven, Ant, Gradle), über ein Command Line Tool oder über spezifische Herstellerplugins. Der Einsatz eines Datenbank-Migrationstools bringt meist Anforderungen an das Naming der Migrationsfiles mit. Dieses Naming wird initial auf alle Datenbank-Migrationselemente angewendet. Bei einer Integration über die Build Tools oder die Herstellerplugins wird die Datenbankmigration beim Build der Applikation getriggert. Sie wird somit durchlaufen, kurz vor dem Build der Applikation. Beim Szenario der Command Line muss die Datenbankmigration während des Deployments über das CI/CD Tool getriggert werden.

4. Elemente einchecken

Die generierten Elemente der Datenbank müssen in die Quellcodeverwaltung eingecheckt werden. Wenn bisher noch kein Versionsverwaltungstool eingesetzt wird, empfiehlt sich hier die Wahl eines verteilten Versionskontrollsystems wie Git, da der Entwickler das komplette Repository während der Entwicklung auch lokal zur Verfügung hat und somit unabhängiger arbeiten kann.

5. Entwicklerteam schulen

Damit zukünftig alle Änderungen auf der Datenbank über das automatische Deployment erfolgen, ist es notwendig, das ganze Entwicklerteam auf den sich veränderten Entwicklungsprozess von Datenbankelementen zu schulen. Denn nur wenn alle den selben Prozess anwenden, kann dieser zukünftig stabil und fehlerfrei durchgeführt werden. Beim Einsatz von Datenbank-Migrationstools dürfen nie manuelle Änderungen auf einem der Datenbanksysteme stattfinden. Deployments werden ausschliesslich über die Automatisierung und somit über Codechanges im Quellcode ausgeführt.

6. Testdeployment

Wenn alle Schritte durchgeführt wurden, wird das Deployment getestet und letzte Fehler werden eliminiert.
Sind alle 6 Schritte abgeschlossen, sind Sie bereit für die Weiterentwicklung der Applikation unter Sicherstellung der Versionskontrolle!

Diso AG – Der Schweizer Daten- und Cloud-Experte

Die Diso AG ist ein renommierter IT-Dienstleister und langjähriger Oracle-Vertriebspartner in der Schweiz mit Schwerpunkten in den Bereichen Datenbanken und Cloud-Lösungen. Diso bietet ihren Kunden beispielsweise die Oracle Plattform as a Service-Lösung und die dazugehörige Datenmigration an. Kunden profitieren des Weiteren vom Komplettlösungsangebot im Sinne von Planung, Integration, Support inklusive Betrieb und Überwachung von IT-Infrastrukturen und Datenbanksystemen.
Im Bereich Software-Engineering entwickelt Diso massgeschneiderte IT und Software-Lösungen für unternehmensspezifische Anwendungen, wann immer sinnvoll mit einem mobile-first Ansatz. Zudem ist Diso Spezialist wenn es um die Software-basierte Optimierung von Performance geht. Auf die Kompetenz des traditionsreichen IT-Dienstleisters und Mittelständlers vertrauen bereits namhafte Kunden aus den Schwerpunktbranchen Banken, Versicherungen Detailhandel und öffentliche Verwaltung.
Die Diso designt wandlungsfähige IT-Systeme, entwickelt massgeschneiderte Software und ermöglicht die performante Verwendung und Auswertung von Informationen.

Über den Autor:

Jasmin Fluri arbeitet bei der Diso AG als Database Consultant im Bereich Big Data, Data Mining, Oracle und DevOps. Während ihres Bachelorstudiums in Wirtschaftsinformatik an der Berner Fachhochschule mit Vertiefung in eBusiness & eGovernment setzte sie sich umfassend mit dem Thema DevOps und den automatisierten Prozessen in der Softwareentwicklung auseinander. Hierfür erhielt sie 2016 den Ehrenpreis für die beste Bachelor-Thesis. Seit einem Jahr unterrichtet sie unter anderem für die Diso AG als Lehrbeauftragte an der Fachhochschule Nordwestschweiz im Studiengang Informatik die Module Software Construction und Code Review.