Datenbankstrukturen abgleichen

Hallo,

ich suche eine Möglichkeit, irgendwie zwei verschiedene Datenbanken strukturtechnisch zu vergleichen um am Schluß ein „Änderungsskript“ zu erhalten, über welches man die Struktur der zweiten Datenbank an die erste anpassen kann.

Beispiel 1:

Datenbank 1 beinhaltet eine Tabelle pages, welche in Datenbank 2 nicht existiert.
Das Skript sollte in dem Fall bei Datenbank 2 die fehlende Tabelle mit allen Feldern erzeugen.

Beispiel 2:

Datenbank 1 und Datenbank 2 haben zwar beide die Tabelle pages, allerdings hat bei Datenbank 1 die Tabelle pages das zusätzliche Feld parent_id, welches bei Datenbank 2 noch nicht vorhanden ist.
Das Skript sollte nun in dem Fall bei Datenbank 2 in der Tabelle pages das fehlende Feld ergänzen.

Leider habe ich keine Ahnung, wie man sowas realisieren kann. Allerdings weiß ich, daß das funktioniert, da bei uns in der Speditionssoftware so eine Funktion beinhaltet ist, welche bei Updates automatisch die Datenbank anpasst ohne daß ein fester vorheriger Stand für das Update erforderlich wäre.

Ich bin hier mal für jeden Tip dankbar.

Gruß

Thomas

Hallo Thomas,

welche DB? Soweit ich mich erinnere, bietet TOAD (Quest-Software) genau solche Moeglichkeiten (DBs / Schemata etc. etc. vergleichen), allerdings nur auf Oracle-Datenbanken.

gruss
bernhard

Hallo Bernhard,

es handelt sich um MySQL.

Gruß

Thomas

Hallo Thomas,

dafür haben die Datenbanken sogenannte Systemtabellen. Im MySQL sind diese im Handbuch im Kapitel 22 beschrieben. Die Tabellen sind z.B. wie folgt gespeichert.
SELECT table_name FROM INFORMATION_SCHEMA.TABLES
[WHERE table_schema = ‚db_name‘]
[WHERE|AND table_name LIKE ‚wild‘]

gibt die gleiche Anzeige aus wie:

SHOW TABLES
[FROM db_name]
[LIKE ‚wild‘]

Also mit einem kleinem Quter-Join kann man auch die Tabellen herausfinden, die sich nicht einer der beiden DB befinden.

Aber wie weit soll denn dieser Abgleich gehen? Die Spalte anfügen wäre ja kein Problem, aber die eingetragene Werte übernehmen oder gar einzelne Tabellen Datensatz für Datensatz vergleichen? Das Script könnte eigentlich nur ein Art Qualitätstool sein und auf keinen Fall ein Ersatz für Replikation.

MfG Georg V.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Georg,

dafür haben die Datenbanken sogenannte Systemtabellen. Im
MySQL sind diese im Handbuch im Kapitel 22 beschrieben. Die
Tabellen sind z.B. wie folgt gespeichert.
SELECT table_name FROM INFORMATION_SCHEMA.TABLES
[WHERE table_schema = ‚db_name‘]
[WHERE|AND table_name LIKE ‚wild‘]

gibt die gleiche Anzeige aus wie:

SHOW TABLES
[FROM db_name]
[LIKE ‚wild‘]

Also mit einem kleinem Quter-Join kann man auch die Tabellen
herausfinden, die sich nicht einer der beiden DB befinden.

Aber wie weit soll denn dieser Abgleich gehen? Die Spalte
anfügen wäre ja kein Problem, aber die eingetragene Werte
übernehmen oder gar einzelne Tabellen Datensatz für Datensatz
vergleichen? Das Script könnte eigentlich nur ein Art
Qualitätstool sein und auf keinen Fall ein Ersatz für
Replikation.

genau darum geht es, ich will keine komplette Replikation der Datenbank sondern ausschließlich der Struktur.

Es geht im Prinzip darum, einen „Standardinternetauftritt“ zu schreiben, den verschiedene Gruppen verwenden können.
Nun will ich natürlich an der Testversion weiterentwickeln können und zu jeder Zeit nun die aktuell gerade existierende Version weiterverbreiten. Da ich ja nun weder weiß, welchen Stand die Datenbank gerade hat, die das Update bekommt, noch ich mir im Überfluß dazu auch noch merken will, was ich jeweils gerade verändert habe, wäre hier eine solche Abgleichmöglichkeit natürlich dafür geschickt.
Wie gesagt, ich kenne ein Programm, das funktioniert nach dem Prinzip, aber ich komme halt nicht auf das Prinzip, das dahintersteckt.

Die Idee mit den Systables hört sich gut an. Allerdings könnte es im WEB problematisch sein, weil man nicht lesend an die Systables herankommt. Aber eventuell läßt sich der Tip ja ausbauen.

Gruß

Thomas