Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Update Metadaten SQL (https://www.delphipraxis.net/136084-update-metadaten-sql.html)

hanspeter 23. Jun 2009 10:36

Datenbank: Firebird • Version: 2.1 • Zugriff über: IBDAC

Update Metadaten SQL
 
Hallo,
ich erzeuge eine FB Datenbank über einen von IBExpert ausgegebenen Script.
Jetzt möchte ich bei Programmneustart diesen Script mit der aktiven Datenbank
vergleichen und die vorhandene Datenbank updaten.
(Es können nur Felder hinzukommen oder die Größe von Feldern wird geändert.)
Ehe ich selbst anfange zu programmieren, kennt wer eine fertige Lösung?
IBExpert z.B. vergleicht 2 Datenbanken und erzeugt daraus einen Differenzscript.
IbExpert möchte ich bei dem Anwender aber nicht voraussetzen.

Mit Gruß
Peter

mkinzler 23. Jun 2009 10:39

Re: Update Metadaten SQL
 
Vergleiche die Systemtabellen

hanspeter 23. Jun 2009 11:43

Re: Update Metadaten SQL
 
Zitat:

Zitat von mkinzler
Vergleiche die Systemtabellen

Wie man das realisieren kann weis ich selber.
Die Datenbank ist auf dem User-Rechner nur einmal da, da gibt es keine zwei Systemtabellen zum Vergleich.

Meine Frage ist, ob jemand ein Tool kennt, das auch etwas kosten darf,
was mir einen Differenzscript zwischen aktueller Datenbank und einen
Referenzscript erzeugt oder die Datenbank gleich modifiziert.


Gruß
Peter

generic 23. Jun 2009 12:47

Re: Update Metadaten SQL
 
LiquiBase!
http://en.wikipedia.org/wiki/LiquiBase

manfred_h 23. Jun 2009 14:16

Re: Update Metadaten SQL
 
Hallo Hanspeter

für IBExpert existiert ein Plugin IBDatabase Comparer.
Womöglich hilft Dir dieser weiter.

Shalom
Manfred

DeddyH 23. Jun 2009 14:17

Re: Update Metadaten SQL
 
Müsste dazu aber nicht IBExpert auch beim Kunden installiert sein?

hanspeter 23. Jun 2009 14:29

Re: Update Metadaten SQL
 
Danke.

LiquiBase schaue ich mir mal an.

Ich habe IBExpert als Vollversion. Da ist das Plugin dabei. Habe ich auch schon verwendet.
Da werden zwei Datenbanken vergleichen und ein Differenzscript erstellt.
Entweder nur für die Metadaten oder für Metadaten und Userdaten.

Der Hintergrund meiner Frage ist übrigens nicht uninteressant.
Ich habe FB Datenbanken bisher aus dem Programm heraus erzeugt. Mit D2009 aber Probleme mit der
Anzahl der Proceduren und Strings in einem Unit bekommen.

Jetzt habe ich auf Neuanlage über einen Script umgestellt. Diesen liefere ich auch als Update aus.
Der Script wird von IBExpert erzeugt und hat in der 2. Quellzeile einen Standardeintrag.
Dieser enthält Datum und Urzeit der Erzeugung.
Dieses Datum schreibe ich in die Datenbank.
Bei jedem Neustart lese ich aus dem Script diesen Zeitstempel aus und vergleiche ihn mit dem Datenbankeintrag.
Ist der Script neuer soll automatisch ein Update erfolgen.

Gruß
Peter

hoika 23. Jun 2009 14:30

Re: Update Metadaten SQL
 
Hallo,

das macht man aber etwas anders.
Führe eine DB-Nummer mit.

Die Nummer sagte dir, welche Struktur die Tabelle hat.
Jede neue Sache (Tabelle, Index usw.) bekommt eine neue höhere Nummer.

Du liest die alte aus, und führst dann nur die "Neu"-Änderungen aus,
z.B. über eine TXXScript-Komponente.

Vorteil:
Klappt mit jedem alten DB-Stand.


Heiko

manfred_h 23. Jun 2009 14:44

Re: Update Metadaten SQL
 
Zitat:

Zitat von DeddyH
Müsste dazu aber nicht IBExpert auch beim Kunden installiert sein?

Doch das sollte natürlich installiert sein.
Die Idee von Peter ist dann schon besser.

Da gab es vor einiger Zeit einen Thread diesbezüglich:
http://www.delphipraxis.net/internal...ct.php?t=49715

Shalom
Manfred

hanspeter 23. Jun 2009 20:05

Re: Update Metadaten SQL
 
Zitat:

Zitat von hoika
Hallo,
das macht man aber etwas anders.
Führe eine DB-Nummer mit.
Heiko

Lohnt sich in diesem Fall nicht.
Die Datenbank wird etwa 4 Wochen vor einer Veranstaltung angelegt und 2 Wochen nach der Veranstaltung archiviert.
Eine archivierte Datenbank muss 2 Jahre aufbewahrt werden und wird nur im Ausnahmefall nochmals benötigt.
Oft kommt es vor, das aufgrund von Regeländerungen eine schnelle Änderung wärend der Veranstaltung notwendig ist.
Dann schicke ich das geänderte Script. Alles andere muss automatisch ablaufen.

Bei alten Datenbanken, welche nochmals benötigt werden, habe ich einen anderen Weg gewählt.
Ich gebe die gesamte Datenbank als XML Dateien aus. Diese kann ich dann bei Bedarf in eine Datenbank mit neuer Struktur einlesen.

Gruß
Peter

IBExpert 24. Jun 2009 08:11

Re: Update Metadaten SQL
 
Warum in die Ferne schweifen wenn bexpert das alles kann
lege folgendes als datei comp.sql ab:

SQL-Code:
execute ibeblock
as
begin
  create connection RefDB dbname 'localhost:c:\RefDB.fdb'   password 'masterkey' user 'SYSDBA' clientlib 'C:\Program Files\Firebird\bin\fbclient.dll';
  create connection CustDB dbname 'localhost:c:\KundenDB.fdb' password 'masterkey' user 'SYSDBA' clientlib 'C:\Program Files\Firebird\bin\fbclient.dll';

  cbb = 'execute ibeblock (
         LogMessage variant)
         as
         begin
           ibec_progress(LogMessage);
         end';

  ibec_CompareMetadata(RefDB, CustDB, 'C:\CompRes.sql', '', cbb);

  close connection RefDB;
  close connection CustDB;
end
sämtliche Optionen sind hier beschrieben: http://ibexpert.net/ibe/index.php?n=...ompareMetadata

Ausführen kannst du das ganze mit ibescript.exe als batchdatei oder aus deiner applikation mit ibescript.dll auf jedem lizensierten Rechner,
ibescript.exe comp.sql
ibescript.exe compRes.sql
und schon ist die DB angepasst

Um das ausführen zu können brauchst du
-entweder eine IBExpert Vollversion auf dem Rechner wo das uasgeführt wird, Kosten 189 Euro
-oder eine Lizenz der IBExpert Servertools, kostet als Zehnerpack zur Weitergabe an Kunden 49,90 Euro pro Kunde (http://ibexpert.net/shop/pi13/pi15/index.html)
-oder eine VAR Lizenz, dann kannst du das unbegrenzt weitergeben an alle Kunden

In den Servertools sind noch weitere Sachen dabei, zum Beispiel Backup/Restore scheduler usw.

Die komplette ibeblock Implementation ist ausgelegt für nicht beaufsichtigte Ausführung beim Endanwender.

Kleiner Tip nebenbei: Mal eben Systemtabellen vergleichen reicht da nicht, weil diverse Abhängigkeiten aufgelöst werden müsssen und ggf vor dem Metadatenupdate die Objekt in der richtigen Reihenfolge zerstört werden müssen, um danach dann wieder erzeugt zu werden.

Ein Kunde hatte mal so was ähnliches selbst programmiert und einen Fehler nicht berücksichtigt, daher liess sein Updateprogramm die DB ohne Fehlermeldung komplett ohne Indizes, Primärschlüssel und Fremdschlüssel zurück. Das man auf der DB nicht mehr arbeiten konnte kann man sich vorstellen.

[edit=mkinzler]SQL-Tag eingefügt Mfg, mkinzler[/edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz