AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Datenbank überprüfen und ggf. modifizieren
Thema durchsuchen
Ansicht
Themen-Optionen

Datenbank überprüfen und ggf. modifizieren

Ein Thema von Captnemo · begonnen am 21. Jun 2016 · letzter Beitrag vom 21. Jun 2016
Antwort Antwort
Benutzerbild von Captnemo
Captnemo

Registriert seit: 27. Jan 2003
Ort: Bodenwerder
1.126 Beiträge
 
Delphi XE4 Architect
 
#1

Datenbank überprüfen und ggf. modifizieren

  Alt 21. Jun 2016, 08:19
Datenbank: MSQL • Version: 5.6 • Zugriff über: Zeos
Hi Leute,

ich erzeuge aus meiner Anwendung heraus alle für die Anwendung benötigten Tabellen und Felder mit ihren benötigten Attributen (z.b. Feldtyp, Länge, Autoinc, Defaultvalue, NotNull, usw.).
Mein Anwendung soll aber nach jedem Update diese Datenbank anhand einer Referenz, die ebenfalls in der Anwendung vorhanden ist, prüfen, ob ggf. Ergänzungen oder Änderungen an den Tabellen, Feldern oder Indizes notwendig ist.

Zur Zeit mach ich das alles per Hand über "Show Tables", "Show Fields" bzw. "Show Index" und parse das Ergebnis quasi zu Fuß.
Aber die Anzahl der Tabellen ist mittlerweile um einiges angestiegen und damit natürlich auch die Anzahl der Felder und der Indizes, die es zu überprüfen gilt.

Die Prüfung ob eine Tabelle existiert oder eben nicht, ist nicht so aufwendig und funktioniert mit "Show tables" ausreichend. Das gleiche gilt für die Indezes.
Aber alle Felder der Tabelle zu prüfen, und halt auch ob ihre Attribute noch stimmen, ist schon um einiges aufwendiger.

Das Ziel ist klar. Bei jedem Update beim Kunden sollen neue Tabellen, Felder und Indizes hinzugefügt werden. Aber auch Veränderung von z.B. Feldlängen oder Feldattributen sollen zuverlässig umgesetzt werden. Und natürlich sollten nicht mehr benötigte Felder entfernt werden, damit keine Datenleichen rumliegen.

Ich wäre also für Anregungen dankbar, wie ich das mit den Felder Zeit-, Code- und Ressourcenschonend hinbekommen könnte. Vielleicht hat der eine oder andere von euch das bereit gemacht.
Dieter
9 von 10 Stimmen in meinem Kopf sagen ich bin nicht verrückt. Die 10. summt dazu die Melodie von Supermario Bros.
MfG Captnemo
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#2

AW: Datenbank überprüfen und ggf. modifizieren

  Alt 21. Jun 2016, 08:27
Hast Du denn einen Überblick, welche Versionen "draußen" sind? Oder ist es eher Wildwuchs?
Davon abhängig müsste man ein Verfahren finden.
Wenn Du aber bereits diese Referenzen nutzt, dann klingt das doch nach klaren Statusangaben, für die es dann jeweils ein festes Upgrade Script geben müsste.
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Datenbank überprüfen und ggf. modifizieren

  Alt 21. Jun 2016, 08:46
@jobo

Ich erledige so etwas mit UpdateScripts. Dabei kann man nicht nur die Struktur verändern, sondern auch die Daten in den alten Tabellen in diese neue Struktur überführen (wenn es mal eine etwas größere Änderung gibt).
Delphi-Quellcode:
type
  IUpdateDatabase = interface
    [ '{3168C196-3301-4327-8135-C21378B17843}' ]
    function GetVersion( ): Integer;
    procedure ExecuteUpdateScript( const aScript: string );
  end;

  IUpdateStore = interface
    [ '{16A0E5BF-DC27-4D4C-A3D3-968F406C44B6}' ]
    function HasScriptFor( aVersion: Integer ): Boolean;
    function GetScriptFor( aVersion: Integer ): string;
  end;

  TDatabaseUpdater = class
  private
    FScriptStore: IUpdateStore;
  public
    constructor Create( const aScriptStore: IUpdateStore );

    function Update( const aDatabase: IUpdateDatabase ): Integer;
  end;

{ TDatabaseUpdater }

constructor TDatabaseUpdater.Create( const aScriptStore: IUpdateStore );
begin
  inherited Create;
  FScriptStore := aScriptStore;
end;

function TDatabaseUpdater.Update( const aDatabase: IUpdateDatabase ): Integer;
var
  lCurrentVersion: Integer;
  lScript : string;
begin
  lCurrentVersion := aDatabase.GetVersion( );
  while FScriptStore.HasScriptFor( lCurrentVersion ) do
    begin
      lScript := FScriptStore.GetScriptFor( lCurrentVersion );
      aDatabase.ExecuteUpdateScript( lScript );
      lCurrentVersion := aDatabase.GetVersion( );
    end;
  Result := lCurrentVersion;
end;

end.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (21. Jun 2016 um 09:07 Uhr)
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#4

AW: Datenbank überprüfen und ggf. modifizieren

  Alt 21. Jun 2016, 09:51
Wir speichern eine Version irgendwo in der Datenbank und für jeden einzelnen Versionssprung gibt es ein Updateskript. So braucht man nur prüfen, welche Version der Kunde hat und alle nachfolgenden Updates der Reihe nach ausführen, bis man auf dem aktuellen Stand ist.

Alle Tabellen zu prüfen, was da wo drin ist, ist ja sonst ein Heidenaufwand und fehleranfällig ohne Ende.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Datenbank überprüfen und ggf. modifizieren

  Alt 21. Jun 2016, 12:44
Wir speichern eine Version irgendwo in der Datenbank und für jeden einzelnen Versionssprung gibt es ein Updateskript. So braucht man nur prüfen, welche Version der Kunde hat und alle nachfolgenden Updates der Reihe nach ausführen, bis man auf dem aktuellen Stand ist.
Das sollte im Prinzip der übliche Weg sein.
Falls aber Wildwuchs vorhanden ist gibt es zwei Möglichkeiten
a) Radikal jede Installation in einen definierten Zustand bringen, und dann die notwendigen Updates durchführen
b) Die Tabellen und Spalten die bekannt sind bearbeiten, und alle anderen zusätzlichen Tabellen und Spalten ignorieren, soweit möglich.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Datenbank überprüfen und ggf. modifizieren

  Alt 21. Jun 2016, 18:51
Mache ich auch so. Vor dem ersten mal hatte ich mich ziemlich gefürchtet, dann aber gemerkt dass es eigentlich total einfach ist:
  1. Die Datenbank enthält immer eine Versionsinformation, z.B. einfach nur eine Tabelle mit dem Eintrag "1.3"
  2. Die Software braucht eine bestimmte Version. Zum Beispiel "1.5"
  3. Beim Start wird geschaut ob die Datenbank in der notwendigen Version vorliegt:
  4. Ist die Version "1.3"? Dann führe das Update-Script von 1.3 auf 1.4 aus
  5. Ist es "1.4"? Dann führe das Update-Script von 1.4 auf 1.5 aus

Klappt super. Zumindest habe ich noch von keinem Kunden gehört dass plötzlich alle seine Daten weg seien

(Ich mache trotzdem vorher ein Backup. Wenn der Platz nicht ausreicht schreit das Programm um Hilfe)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Datenbank überprüfen und ggf. modifizieren

  Alt 21. Jun 2016, 19:09
So ein Update sollte (wenn möglich) immer in einer Transaktion laufen und/oder mit einer Datensicherung (die der Kunde laut Vertrag eh immer machen muss )

Wenn man möchte, kann man mit fortschreitenden Versionsnummern auch Updatescripts anbieten, die einen größeren Versionssprung machen.

Die muss man allerdings auch wieder testen ... ist also eher theoretisch (funktionieren würde es aber )
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz