Gibt es ein Versionskontrollsystem für Änderungen der Datenbankstruktur?

124

Ich stoße oft auf folgendes Problem.

Ich arbeite an einigen Änderungen an einem Projekt, die neue Tabellen oder Spalten in der Datenbank erfordern. Ich nehme die Datenbankänderungen vor und setze meine Arbeit fort. Normalerweise erinnere ich mich daran, die Änderungen aufzuschreiben, damit sie auf dem Live-System repliziert werden können. Ich erinnere mich jedoch nicht immer daran, was ich geändert habe, und ich erinnere mich nicht immer daran, es aufzuschreiben.

Also mache ich einen Push zum Live-System und bekomme einen großen, offensichtlichen Fehler, dass es keinen gibt NewColumnX, ugh.

Gibt es ein Versionskontrollsystem für Datenbanken, unabhängig davon, dass dies in dieser Situation möglicherweise nicht die beste Vorgehensweise ist? Die spezifische Datenbanktechnologie ist mir egal. Ich möchte nur wissen, ob es eine gibt. Wenn es mit MS SQL Server funktioniert, dann großartig.

Gefährdete Masse
quelle
In unserer themenbezogenen Anleitung heißt es: " Einige Fragen sind immer noch nicht thematisch, auch wenn sie in eine der oben aufgeführten Kategorien passen: ... Fragen, die uns bitten, ein Buch, ein Tool, eine Softwarebibliothek, ein Tutorial oder eine andere zu empfehlen oder zu finden Off-Site-Ressourcen sind nicht zum Thema ... "
Robert Columbia

Antworten:

62

In Ruby on Rails gibt es ein Konzept für eine Migration - ein schnelles Skript zum Ändern der Datenbank.

Sie generieren eine Migrationsdatei, die Regeln zum Erhöhen der Datenbankversion (z. B. Hinzufügen einer Spalte) und Regeln zum Herabstufen der Version (z. B. Entfernen einer Spalte) enthält. Jede Migration ist nummeriert und eine Tabelle verfolgt Ihre aktuelle Datenbankversion.

Um nach oben zu migrieren , führen Sie einen Befehl namens "db: migrate" aus, der Ihre Version überprüft und die erforderlichen Skripte anwendet. Sie können auf ähnliche Weise nach unten migrieren.

Die Migrationsskripte selbst werden in einem Versionskontrollsystem gespeichert. Wenn Sie die Datenbank ändern, checken Sie ein neues Skript ein, und jeder Entwickler kann es anwenden, um seine lokale Datenbank auf die neueste Version zu bringen.

Kalid
quelle
2
Dies ist die Wahl für Ruby-Projekte. Das nächste Äquivalent zu diesem Entwurf in Java sind Mybatis-Schema-Migrationen. Für .NET lautet das Äquivalent code.google.com/p/migratordotnet . Sie sind alle ausgezeichnete Werkzeuge für diesen Job IMO.
Dan Tanner
30

Ich bin ein bisschen altmodisch, da ich Quelldateien zum Erstellen der Datenbank verwende. Es gibt tatsächlich zwei Dateien - project-database.sql und project-updates.sql - die erste für das Schema und die persistenten Daten und die zweite für Änderungen. Natürlich stehen beide unter Quellcodeverwaltung.

Wenn sich die Datenbank ändert, aktualisiere ich zuerst das Hauptschema in project-database.sql und kopiere dann die relevanten Informationen in die project-updates.sql, z. B. ALTER TABLE-Anweisungen. Ich kann dann die Aktualisierungen auf die Entwicklungsdatenbank anwenden, testen und iterieren, bis alles gut gemacht ist. Checken Sie dann die Dateien ein, testen Sie sie erneut und wenden Sie sie auf die Produktion an.

Außerdem habe ich normalerweise eine Tabelle in der Datenbank - Config - wie zum Beispiel:

SQL

CREATE TABLE Config
(
    cfg_tag VARCHAR(50),
    cfg_value VARCHAR(100)
);

INSERT INTO Config(cfg_tag, cfg_value) VALUES
( 'db_version', '$Revision: $'),
( 'db_revision', '$Revision: $');

Dann füge ich dem Update-Bereich Folgendes hinzu:

UPDATE Config SET cfg_value='$Revision: $' WHERE cfg_tag='db_revision';

Das wird db_versionnur geändert, wenn die Datenbank neu erstellt wird, und diedb_revision gibt mir einen Hinweis darauf, wie weit von der Basislinie entfernt ist.

Ich könnte die Updates in ihren eigenen separaten Dateien aufbewahren, aber ich habe mich dafür entschieden, sie alle zusammen zu mischen und relevante Abschnitte mit Ausschneiden und Einfügen zu extrahieren. Ein bisschen mehr Housekeeping ist angebracht, dh entfernen Sie ':' aus $ Revision 1.1 $, um sie einzufrieren.

dar7yl
quelle
12

MyBatis (ehemals iBatis) verfügt über ein Schema-Migrations- Tool zur Verwendung in der Befehlszeile. Es ist in Java geschrieben, kann aber mit jedem Projekt verwendet werden.

Um eine gute Praxis für das Management von Datenbankänderungen zu erreichen, müssen wir einige wichtige Ziele identifizieren. Daher versucht das MyBatis Schema Migration System (oder kurz MyBatis Migrations) Folgendes:

  • Arbeiten Sie mit jeder neuen oder vorhandenen Datenbank
  • Nutzen Sie das Quellcodeverwaltungssystem (z. B. Subversion).
  • Ermöglichen Sie gleichzeitigen Entwicklern oder Teams, unabhängig zu arbeiten
  • Konflikte sehr sichtbar und leicht handhabbar zulassen
  • Vorwärts- und Rückwärtsmigration zulassen (Entwickeln bzw. Entwickeln)
  • Machen Sie den aktuellen Status der Datenbank leicht zugänglich und verständlich
  • Aktivieren Sie Migrationen trotz Zugriffsrechten oder Bürokratie
  • Arbeiten Sie mit jeder Methode
  • Fördert gute, konsequente Praktiken
Chadwick
quelle
12

Redgate hat ein Produkt namens SQL Source Control . Es lässt sich in TFS, SVN, SourceGear Vault, Vault Pro, Mercurial, Perforce und Git integrieren.

Gefährdete Masse
quelle
11

Ich kann SQL Delta nur empfehlen . Ich verwende es nur, um die Diff-Skripte zu generieren, wenn ich mit dem Codieren meiner Funktion fertig bin, und überprüfe diese Skripte in meinem Versionsverwaltungs-Tool (Mercurial :))

Sie haben sowohl eine SQL Server- als auch eine Oracle-Version.

Alex
quelle
11

Ich frage mich, dass niemand das Open-Source-Tool liquibase erwähnt hat, das auf Java basiert und für fast jede Datenbank funktionieren sollte, die jdbc unterstützt. Im Vergleich zu Rails wird XML anstelle von Ruby verwendet, um die Schemaänderungen durchzuführen. Obwohl ich XML für domänenspezifische Sprachen nicht mag, ist der sehr coole Vorteil von XML, dass Liquibase weiß, wie man bestimmte Operationen wie zurücksetzt

<createTable tableName="USER"> 
   <column name="firstname" type="varchar(255)"/>
</createTable>

Sie müssen sich also nicht selbst darum kümmern

Es werden auch reine SQL-Anweisungen oder Datenimporte unterstützt.

Karussell
quelle
Wir verwenden Liquibase, aber wir verwenden 3 verschiedene Ansätze für die verschiedenen Informationen: 1. Struktur (Tabelle, Ansichten, ...): historisches Änderungsprotokoll 2. Codes (Prozeduren, pl / sql, Funktionen): Änderungsprotokoll mit nur einem Änderungssatz, der mit markiert ist runalways = true runonchange = true 3. Codetabellen, andere in Tabellen gespeicherte Meta- "Konstanten": der gleiche Ansatz wie für Codes, nur ein Änderungssatz, löschen aus, alle Informationen einfügen
Palesz
Für Java empfehle ich dringend, in diesen Tagen einen Blick auf flywaydb.org zu werfen - siehe auch den Funktionsvergleich auf dieser Website
Karussell
10

Die meisten Datenbankmodule sollten das Speichern Ihrer Datenbank in einer Datei unterstützen. Ich weiß, dass MySQL es sowieso tut. Dies ist nur eine Textdatei, sodass Sie diese an Subversion oder was auch immer Sie verwenden senden können. Es wäre auch einfach, ein Diff für die Dateien auszuführen.

Ryan Fox
quelle
12
Ja, aber unterschiedliche SQL-Dateien geben Ihnen nicht die erforderlichen Skripte, um Ihre dev / prod-Datenbank von einer Revision auf eine andere zu aktualisieren
Asaf Mesika
9

Wenn Sie SQL Server verwenden, ist Data Dude (auch bekannt als Database Edition von Visual Studio) kaum zu übertreffen. Sobald Sie den Dreh raus haben, ist es ein Kinderspiel, einen Schema-Vergleich zwischen Ihrer quellgesteuerten Version der Datenbank und der Version in der Produktion durchzuführen. Und mit einem Klick können Sie Ihre diff DDL generieren.

Es gibt ein Lehr - Video auf MSDN , die sehr hilfreich ist.

Ich kenne DBMS_METADATA und Toad, aber wenn jemand einen Data Dude für Oracle entwickeln könnte, wäre das Leben wirklich süß.

Perry Tribolet
quelle
8

Lassen Sie Ihre ersten Tabellenanweisungen im Versionscontroller erstellen und fügen Sie dann Tabellenanweisungen hinzu, aber bearbeiten Sie niemals Dateien, sondern ändern Sie nur Dateien, die idealerweise nacheinander benannt sind, oder sogar als "Änderungssatz", damit Sie alle Änderungen für eine bestimmte Bereitstellung finden können.

Der schwierigste Teil, den ich sehen kann, ist das Verfolgen von Abhängigkeiten, z. B. für eine bestimmte Bereitstellungstabelle B muss möglicherweise vor Tabelle A aktualisiert werden.

Matthew Watson
quelle
8

Für Oracle verwende ich Toad , mit dem ein Schema auf mehrere diskrete Dateien (z. B. eine Datei pro Tabelle) ausgegeben werden kann. Ich habe einige Skripte, die diese Sammlung in Perforce verwalten, aber ich denke, dass sie in nahezu jedem Revisionskontrollsystem leicht machbar sein sollte.

Mark Harrison
quelle
8

Schauen Sie sich das Oracle-Paket DBMS_METADATA an.

Insbesondere sind folgende Methoden besonders nützlich:

  • DBMS_METADATA.GET_DDL
  • DBMS_METADATA.SET_TRANSFORM_PARAM
  • DBMS_METADATA.GET_GRANTED_DDL

Sobald Sie mit ihrer Funktionsweise vertraut sind (ziemlich selbsterklärend), können Sie ein einfaches Skript schreiben, um die Ergebnisse dieser Methoden in Textdateien abzulegen, die unter Quellcodeverwaltung gestellt werden können. Viel Glück!

Ich bin mir nicht sicher, ob es für MSSQL etwas so Einfaches gibt.

Mike Farmer
quelle
7

Ich schreibe meine DB-Release-Skripte parallel zur Codierung und behalte die Release-Skripte in einem projektspezifischen Abschnitt in SS. Wenn ich den Code ändere, für den eine Datenbankänderung erforderlich ist, aktualisiere ich gleichzeitig das Release-Skript. Vor der Veröffentlichung führe ich das Freigabeskript auf einer sauberen Entwicklungsdatenbank aus (kopierte Struktur aus der Produktion) und führe meine letzten Tests darauf durch.

hamishmcn
quelle
7

Ich habe dies jahrelang hin und her gemacht - Schemaversionen verwalten (oder versuchen, sie zu verwalten). Die besten Ansätze hängen von den Tools ab, über die Sie verfügen. Wenn Sie das Quest Software-Tool "Schema Manager" erhalten, sind Sie in guter Verfassung. Oracle hat ein eigenes, minderwertiges Tool, das auch "Schema Manager" genannt wird (viel verwirrend?), Das ich nicht empfehle.

Ohne ein automatisiertes Tool (siehe andere Kommentare hier zu Data Dude) verwenden Sie Skripte und DDL-Dateien direkt. Wählen Sie einen Ansatz, dokumentieren Sie ihn und befolgen Sie ihn genau. Ich mag die Möglichkeit, die Datenbank jederzeit neu zu erstellen, daher bevorzuge ich einen vollständigen DDL-Export der gesamten Datenbank (wenn ich der DBA bin) oder des Entwicklerschemas (wenn ich im Produkt bin) Entwicklungsmodus).


quelle
7

PLSQL Developer, ein Tool von All Arround Automations, verfügt über ein Plugin für Repositorys, das mit Visual Source Safe einwandfrei (aber nicht besonders gut) funktioniert.

Aus dem Internet:

Das Versionskontroll-Plug-In bietet eine enge Integration zwischen der PL / SQL-Entwickler-IDE >> und jedem Versionskontrollsystem, das die Microsoft SCC-Schnittstellenspezifikation unterstützt. >> Dies umfasst die gängigsten Versionskontrollsysteme wie Microsoft Visual SourceSafe, >> Merant PVCS und MKS Source Integrity.

http://www.allroundautomations.com/plsvcs.html

Borjab
quelle
7

Mit ER Studio können Sie Ihr Datenbankschema in das Tool umkehren und es dann mit Live-Datenbanken vergleichen.

Beispiel: Kehren Sie Ihr Entwicklungsschema in ER Studio um - vergleichen Sie es mit der Produktion, und es werden alle Unterschiede aufgelistet. Es kann die Änderungen skripten oder einfach automatisch durchsetzen.

Sobald Sie ein Schema in ER Studio haben, können Sie das Erstellungsskript entweder speichern oder als proprietäre Binärdatei speichern und in der Versionskontrolle speichern. Wenn Sie jemals zu einer früheren Version des Schemas zurückkehren möchten, überprüfen Sie es einfach und übertragen Sie es auf Ihre Datenbankplattform.

Bob Probst
quelle
6

Es gibt ein PHP5 "Datenbankmigrationsframework" namens Ruckusing. Ich habe es nicht verwendet, aber die Beispiele zeigen die Idee, dass Sie nur Quelldateien verfolgen müssen, wenn Sie die Datenbank zum Erstellen der Datenbank nach Bedarf verwenden.

Peter Coulton
quelle
4

Sie können Microsoft SQL Server-Datentools in Visual Studio verwenden, um Skripts für Datenbankobjekte als Teil eines SQL Server-Projekts zu generieren. Anschließend können Sie die Skripte mithilfe der in Visual Studio integrierten Quellcodeverwaltungsintegration zur Quellcodeverwaltung hinzufügen. Mit SQL Server-Projekten können Sie außerdem die Datenbankobjekte mithilfe eines Compilers überprüfen und Bereitstellungsskripts generieren, um eine vorhandene Datenbank zu aktualisieren oder eine neue zu erstellen.


quelle
3

Wir haben MS Team System Database Edition verwendet mit ziemlich gutem Erfolg verwendet. Es lässt sich mehr oder weniger nahtlos in die TFS-Versionskontrolle und Visual Studio integrieren und ermöglicht es uns, gespeicherte Prozesse, Ansichten usw. einfach zu verwalten. Konfliktlösung kann schmerzhaft sein, aber der Versionsverlauf ist abgeschlossen, sobald er abgeschlossen ist. Danach sind Migrationen zur Qualitätssicherung und Produktion äußerst einfach.

Es ist jedoch fair zu sagen, dass es sich um ein Produkt der Version 1.0 handelt und nicht ohne Probleme.

marc
quelle
3

Schema Compare für Oracle ist ein Tool, das speziell zum Migrieren von Änderungen aus unserer Oracle-Datenbank in eine andere entwickelt wurde. Bitte besuchen Sie die unten stehende URL für den Download-Link, über den Sie die Software für eine voll funktionsfähige Testversion verwenden können.

http://www.red-gate.com/Products/schema_compare_for_oracle/index.htm

David Atkinson
quelle
2

In Ermangelung eines VCS für Tabellenänderungen habe ich sie in einem Wiki protokolliert. Zumindest kann ich dann sehen, wann und warum es geändert wurde. Es ist alles andere als perfekt, da es nicht jeder tut und wir mehrere Produktversionen verwenden, aber besser als nichts.

steevc
quelle
2

Ich würde einen von zwei Ansätzen empfehlen. Investieren Sie zunächst in PowerDesigner von Sybase. Enterprise Edition. Sie können damit physische Datenmodelle entwerfen und vieles mehr. Es wird jedoch mit einem Repository geliefert, mit dem Sie Ihre Modelle einchecken können. Jedes neue Einchecken kann eine neue Version sein. Es kann jede Version mit jeder anderen Version vergleichen und sogar mit dem, was sich zu diesem Zeitpunkt in Ihrer Datenbank befindet. Anschließend wird eine Liste aller Unterschiede angezeigt und gefragt, welche migriert werden sollen. Anschließend wird das entsprechende Skript erstellt. Es ist nicht billig, aber es ist ein Schnäppchen zum doppelten Preis und der ROI beträgt ungefähr 6 Monate.

Die andere Idee ist, die DDL-Überwachung zu aktivieren (funktioniert in Oracle). Dadurch wird bei jeder Änderung eine Tabelle erstellt. Wenn Sie die Änderungen aus dem Zeitstempel abfragen, in den Sie Ihre Datenbankänderungen zuletzt verschoben haben, um sie jetzt zu erstellen, erhalten Sie eine geordnete Liste aller Aktionen. Einige where-Klauseln zum Eliminieren von Nullsummenänderungen wie create table foo; gefolgt von Drop Table Foo; und Sie können EINFACH ein Mod-Skript erstellen. Warum die Änderungen in einem Wiki behalten, das ist doppelt so viel Arbeit. Lassen Sie sich von der Datenbank verfolgen.

Mark Brady
quelle
1

Zwei Buchempfehlungen: "Refactoring Databases" von Ambler und Sadalage und "Agile Database Techniques" von Ambler.

Jemand erwähnte Rails Migrations. Ich denke, sie funktionieren auch außerhalb von Rails-Anwendungen hervorragend. Ich habe sie in einer ASP-Anwendung mit SQL Server verwendet, die wir gerade auf Rails umstellten. Sie checken die Migrationsskripte selbst in das VCS ein. Hier ist ein Beitrag von Pragmatic Dave Thomas zu diesem Thema.

MattMcKnight
quelle