Tool zum Generieren von SQL-Datenbank-Update-Skripten

Ich suche ein Tool oder ein Open-Source-Projekt, das Datenbank-Update-Skripte auf folgende Weise generieren kann:

  • Akzeptieren Sie eine Datenbankverbindungszeichenfolge als Konfigurationsparameter
  • Stellen Sie eine Verbindung zur angegebenen DB her und erhalten Sie eine Liste aller DB-Objekte: Tabellen, gespeicherte Prozeduren, Einschränkungen usw. (Idealerweise möchte ich die Arten von Objekten anpassen, nach denen gesucht werden soll - dh nur Tabellen oder nur gespeicherte Prozeduren)
  • Generieren Sie ein SQL-Skript, das Code enthält, der überprüft, ob jedes der erkannten Objekte vorhanden ist, und eines erstellt, wenn es nicht vorhanden ist.

Ich muss dies derzeit für eine SQL Server-Datenbank tun.

Der Zweck dieses Tools besteht darin, die Datenbankstruktur regelmäßig zwischen mehreren Instanzen zu synchronisieren.

Windows ist vorzuziehen. Je billiger, desto besser (offensichtlich), idealerweise würde ich gerne ein Open-Source-Projekt finden, das etwas Ähnliches tut. Aber ich habe kein festes Preislimit.

Antworten (3)

Nein, es gibt kein Tool, mit dem Sie alles tun können, was Sie verlangen, nicht mit 100% Erfolg und nicht mit vollständiger Abdeckung.

Fehlende Teile, also Objekte, die später in einer der Instanzen hinzugefügt werden, sind schwierig genug. Änderungen wie geänderte Namen, geänderte Datentypen, gelöschte Spalten oder Tabellen usw. machen jedoch einen regelmäßigen Vergleich mit der Synchronisierung unmöglich.

Datenbank-Diff-Tools

Das Vergleichen zweier Datenbankstrukturen wird manchmal als „Unterschiedsvergleiche“ oder „Vergleichen“ bezeichnet, wie in den Unterschiedserkennungsfunktionen von Texteditoren und Textverarbeitungsprogrammen, die Dokumente vergleichen.

Diese Tools sind spezifisch für bestimmte Datenbankprodukte, da jede Implementierung eines echten Datenbankprodukts den Umfang des SQL-Standards bei weitem überschreitet. Und soweit ich gesehen habe, ist keines dieser Tools zu 100 % vollständig, aufgrund der Komplexität bei der Implementierung eines Datenbanksystems.

Diese Tools können einen Bericht über den Unterschied erstellen. Und einige Tools generieren möglicherweise SQL, um Objekte zu erstellen, die in einem definiert sind, aber in dem anderen fehlen. Aber ich warne Sie davor, solche Berichte oder SQL als perfekt oder vollständig zu betrachten.

Tools für die Datenbankmigration

Die Verwaltung der Änderungen, die im Laufe der Zeit an Ihrer Datenbankstruktur vorgenommen wurden, wird als Datenbankmigrationstool bezeichnet . Der Zweck besteht darin, Ihr Datenbankschema einfach und zuverlässig über alle Ihre Instanzen hinweg weiterzuentwickeln.

Zwei gute in der Java-Welt sind:

Der einfachste Weg, ein solches Tool zu verwenden, befindet sich am Anfang der Datenbank. Anschließend zeichnen Sie jede Änderung des Datenbankschemas als SQL-Skripte auf. Zuerst wird eine zusätzliche Tabelle erstellt, um eine Versionsnummer aufzuzeichnen. Die Skripte können auf jeder Datenbankinstanz ausgeführt werden, um ihr Schema auf den neuesten Stand zu bringen.

Und es gibt Möglichkeiten, ein solches Tool auch für bestehende Datenbanken zu verwenden.

Das ist nicht ganz das was ich suche. Ich möchte nicht jedes Mal manuell Update-Skripte schreiben, wenn ich das Schema ändere (z . B. ALTER TABLE xxx ADD COLUMN yyy). Ich möchte in der Lage sein, automatisch ein einzelnes SQL-Skript zu generieren, das jede Datenbank auf die Struktur meiner lokalen DB aktualisieren würde (Pseudocode: IF COLUMN xxx.yyy NOT EXISTS THEN ALTER TABLE xxx ADD COLUMN yyy). Ich verstehe, dass eine solche Update-Strategie nicht in 100 % der Fälle funktioniert, aber sie wird für meine Bedürfnisse ausreichen.
@holdenmcgrohen Siehe meine Änderungen.

Ich würde den SQL-Vergleich von Redgate wärmstens empfehlen:

http://www.red-gate.com/products/sql-development/sql-compare/

Es scheint die Funktionen zu haben, die Sie brauchen. Ein weiteres ihrer Tools, "Multi Script", würde die Bereitstellung auf mehreren Instanzen ermöglichen:

http://www.red-gate.com/products/dba/sql-multi-script/

Wir verwenden diese seit einiger Zeit und sie sind felsenfest und ziemlich einfach zu handhaben.

Redgate stellt dafür ein fantastisches Produkt her (eigentlich viele fantastische Produkte). Unsere DBAs haben es genau für den Zweck in der Frage verwendet (Synchronisierungsumgebungen/Server).
Danke für den Rat, aber ich suche nicht wirklich nach einem DB-Diff-Tool. Ich möchte in der Lage sein, eine einzelne SQL-Datei zu generieren, die das gesamte Schema einer einzelnen DB-Instanz enthält und dann auf andere DB-Instanzen angewendet und ihre Schemas identisch aktualisiert.
@holdenmcgrohen - ist das kein DB-Diff-Tool (in etwas anderer Form)?
@Paddy, ein Diff-Tool nimmt 2 (oder mehr) Datenbanken und untersucht die Unterschiede. Ich suche nach einer Möglichkeit, ein Skript basierend auf nur 1 Datenbank zu generieren.

Ein bisschen spät, aber ich werde meinen Tipp nur fürs Protokoll hinzufügen: https://www.schemacrawler.com/

Es wird jedoch nicht die SQL-Generierung übernehmen, das müssten Sie selbst tun.

Ich habe die Ausgabe (sowie die Reflexionsinformationen von JPA-Entitäten) als Eingabe für JGraphT (Erstellen eines FK-Diagramms) verwendet, um mithilfe der topologischen Sortierung herauszufinden, wo mit dem Löschen von Zeilen begonnen werden soll, ohne die FK-Einschränkungen zu verletzen. In einer perfekten Datenbankwelt würde Cascade Delete das Problem wohl lösen, aber ...