Datenbankversionierung in installierten Anwendungen mit Delphi

8

Ich arbeite an einer Reihe von Delphi-Anwendungen, die ihre eigenen Datenbankstrukturen aktualisieren müssen, wenn neue Versionen veröffentlicht werden und wenn Benutzer zusätzliche Module installieren. Die Anwendungen verwenden eine Vielzahl von eingebetteten Datenbanken (derzeit DBISAM und Jet, dies kann sich jedoch ändern).

In der Vergangenheit habe ich dies mit DBISAM unter Verwendung der Benutzerversionsnummern getan, die mit jeder Tabelle gespeichert werden können. Ich habe einen zusätzlichen, leeren Satz von Datenbankdateien geliefert und beim Start die Versionsnummern jeder Tabelle mit den FieldDefs verglichen, um die installierte Tabelle bei Bedarf zu aktualisieren. Während dies funktionierte, fand ich es unbeholfen, eine Ersatzkopie der Datenbank zu versenden, und neuere Versionen von DBISAM haben die Tabellenumstrukturierungsmethodik geändert, so dass ich das sowieso neu schreiben muss.

Ich kann zwei Arten der Implementierung sehen: Speichern einer Versionsnummer mit der Datenbank und Verwenden von DDL-Skripten, um von älteren Versionen auf neuere Versionen zu gelangen oder eine Referenzversion der Datenbankstruktur innerhalb der Anwendung zu speichern und die Referenz mit der Datenbank zu vergleichen Beim Start, und die Anwendung generiert DDL-Befehle, um die Datenbank zu aktualisieren.

Ich denke, dass ich wahrscheinlich Teile von beiden implementieren muss. Ich möchte nicht, dass die Anwendung die Datenbank bei jedem Start der Anwendung mit der Referenzstruktur vergleicht (zu langsam). Daher benötige ich eine Versionsnummer der Datenbankstruktur, um festzustellen, ob der Benutzer eine veraltete Struktur verwendet. Ich bin jedoch nicht sicher, ob ich vorgefertigten Skripten vertrauen kann, um die strukturelle Aktualisierung durchzuführen, wenn die Datenbank in der Vergangenheit teilweise aktualisiert worden sein könnte oder wenn der Benutzer selbst die Datenbankstruktur geändert haben könnte Referenz-Diff für das eigentliche Update.

Untersuchung der Frage Ich habe ein paar Tools zur Datenbankversionierung gefunden, aber alle scheinen auf SQL Server ausgerichtet zu sein und werden außerhalb der eigentlichen Anwendung implementiert. Ich bin auf der Suche nach einem Prozess, der eng in meine Anwendung integriert ist und an verschiedene Datenbankanforderungen angepasst werden kann (ich weiß, dass ich Adapter, benutzerdefinierte Nachkommenklassen oder Ereigniscode schreiben muss, um Unterschiede in DDL für verschiedene zu behandeln Datenbanken, das stört mich nicht).

Weiß irgendjemand von etwas aus dem Regal, das dies tut oder das nicht, hat jemand irgendwelche Gedanken zu:

  1. Die beste Möglichkeit, eine Referenzversion einer generischen relationalen Datenbankstruktur in einer Anwendung zu speichern.

  2. Der beste Weg, die Referenz gegen die aktuelle Datenbank zu setzen.

  3. Der beste Weg, DDL zu generieren, um die Datenbank zu aktualisieren.

Larry Lustig 26.11.2009, 15:52
quelle

4 Antworten

2

Ich habe hier einen Blogbeitrag darüber, wie ich dbisam database versioning mache und SQL Server .

Die wichtigen Teile sind:

  

Da dbisam keine Ansichten unterstützt,   Die Versionsnummer wird gespeichert (mit   mit ein paar anderen Informationen) in einem Ini   Datei im Datenbankverzeichnis.

     

Ich habe ein Datamodul,   TdmodCheckDatabase. Das hat a   TdbisamTable-Komponente für jede Tabelle   in der Datenbank. Die Tabellenkomponente   enthält alle Felder in der Tabelle und   wird aktualisiert, wann immer die Tabelle ist   geändert.

     

Um Datenbankänderungen vorzunehmen, muss der   folgender Prozess wurde verwendet:

     
  1. Erhöhen Sie die Versionsnummer in der Anwendung
  2.   
  3. Erstellen und testen Sie DB-Änderungen.
  4.   
  5. Aktualisieren Sie die betroffenen Tabellen in TdmodCheckDatabase
  6.   
  7. Falls erforderlich (selten) fügen Sie weitere Upgrade-Abfragen hinzu   TdmodCheckDatabase. Z.B. einstellen   Werte von neuen Feldern, oder um neue hinzuzufügen   Datenzeilen.
  8.   
  9. Erstellen Sie ein CreateDatabase-Einheitsskript unter Verwendung der bereitgestellten Datenbank   Werkzeuge.
  10.   
  11. Aktualisieren Sie die Einheitentests, um sie an die neue db anzupassen
  12.   

Wenn die Anwendung ausgeführt wird, geht es   durch den folgenden Prozess

     
  1. Wenn keine Datenbank gefunden wird, führen Sie CreateDatabase unit aus und tun Sie dann   Schritt 3
  2.   
  3. Abrufen der aktuellen Versionsnummer aus der Datenbank ini-Datei
  4.   
  5. Wenn es dann weniger als die erwartete Versionsnummer ist     CreateDatabase ausführen (um neue Tabellen zu erstellen)     Überprüfen Sie jede Tabellenkomponente in TdmodCheckDatabase     Wenden Sie alle Tabellenänderungen an     Führen Sie manuelle Upgradeskripte aus
  6.   
  7. Aktualisieren Sie die Versionsnummer in der Datenbank ini-Datei
  8.   

Ein Codebeispiel ist

%Vor%     
SeanX 27.11.2009, 00:10
quelle
5

Ähnliche Geschichte hier. Wir speichern eine DB-Versionsnummer in einer Systemtabelle und überprüfen diese beim Start. (Wenn die Tabelle / das Feld / der Wert nicht existiert, wissen wir, dass es die Version 0 ist, in der wir vergessen haben, dieses Bit hinzuzufügen!)

Während der Entwicklung, wenn wir die Datenbank aktualisieren müssen, schreiben wir ein DDL-Skript, um die Arbeit zu erledigen, und wenn es glücklich ist, dass es funktioniert, wird es der App als Textressource hinzugefügt.

Wenn die App feststellt, dass sie aktualisiert werden muss, werden die entsprechenden Ressourcen geladen und ausgeführt. Wenn mehrere Versionen aktualisiert werden müssen, muss jedes Skript der Reihe nach ausgeführt werden. Stellt sich am Ende nur ein paar Zeilen Code heraus.

Der Hauptpunkt ist, dass wir anstelle der GUI-basierten Tools, um Tabellen ad hoc oder "zufällig" zu modifizieren, die DDL direkt schreiben. Dies macht es viel einfacher, wenn die Zeit gekommen ist, das vollständige Upgrade-Skript zu erstellen. Und Struktur Diffing ist nicht erforderlich.

    
shunty 27.11.2009 09:34
quelle
2

Ich verwende ADO für meine Datenbanken. Ich benutze auch ein Versionsnummern-Schema, aber nur als Plausibilitätsprüfung. Ich habe ein Programm entwickelt, das die Connection.GetTableNames und Connection.GetFieldNames verwendet, um jede Diskrepanz mit einem XML-Dokument zu identifizieren, das die "Master" -Datenbank beschreibt. Wenn es eine Diskrepanz gibt, dann baue ich das entsprechende SQL, um die fehlenden Felder zu erstellen. Ich gebe nie zusätzliche ab.

Ich habe dann eine dbpatch-Tabelle, die eine Liste von Patches enthält, die durch einen eindeutigen Namen identifiziert werden. Wenn bestimmte Patches fehlen, werden sie angewendet und der entsprechende Datensatz zur dbpatch-Tabelle hinzugefügt. In den meisten Fällen handelt es sich um neue gespeicherte Procs oder Feldgrößenanpassungen oder Indizes

Ich führe auch eine min-db-Version, die auch überprüft wird, da ich Benutzern erlaube, eine ältere Version des Clients zu verwenden, ich erlaube ihnen nur eine Version zu verwenden, die & gt; = min-db-version und & lt ist ; = cur-db-Version.

    
skamradt 30.11.2009 17:29
quelle
1

Ich speichere eine Versionsnummer in der Datenbank und eine Versionsnummer in der Anwendung. Jedes Mal, wenn ich die Datenbankstruktur ändern muss, erstelle ich einen Code, um die Struktur der Datenbank zu aktualisieren und die Versionsnummer in der Anwendung zu erhöhen. Wenn die Anwendung gestartet wird, vergleicht sie Zahlen und führt bei Bedarf einen Code zum Aktualisieren der Datenbankstruktur aus UND aktualisiert die Versionsnummer der Datenbank. Somit ist die Datenbank jetzt mit der Anwendung auf dem neuesten Stand. Mein Code ist etwas wie

%Vor%

UpdateStructure führt nur den notwendigen Code aus, etwa:

%Vor%

Sie können denselben Code verwenden, um die Datenbank von Grund auf neu zu erstellen.

%Vor%     
Steve 26.11.2009 21:54
quelle