Wie sollten Sie Ihre Datenbank aus der Quellcodeverwaltung erstellen?

103

Im SO-Community-Wiki wurde diskutiert, ob Datenbankobjekte versioniert werden sollten. Allerdings habe ich nicht für die Erstellung eines Build-Automatisierungsprozess für Datenbankobjekte viel Diskussion über die besten Praktiken gesehen.

Dies war ein umstrittener Diskussionspunkt für mein Team - insbesondere, da Entwickler und Datenbankadministratoren bei der Bewertung der Vorteile und Risiken eines Automatisierungsansatzes für die Datenbankbereitstellung häufig unterschiedliche Ziele, Ansätze und Bedenken verfolgen.

Ich würde gerne einige Ideen von der SO-Community hören, welche Praktiken in der realen Welt effektiv waren.

Mir ist klar, dass es etwas subjektiv ist, welche Praktiken wirklich am besten sind, aber ich denke, ein guter Dialog darüber, welche Arbeit für viele Leute hilfreich sein könnte.

Hier sind einige meiner Teaser-Fragen zu Problembereichen in diesem Thema. Diese sind nicht als endgültige Liste gedacht, sondern als Ausgangspunkt, damit die Leute verstehen, wonach ich suche.

  1. Sollten sowohl Test- als auch Produktionsumgebungen aus der Quellcodeverwaltung erstellt werden?
    • Sollten beide mithilfe von Automatisierung erstellt werden - oder sollte die Produktion durch Kopieren von Objekten aus einer stabilen, endgültigen Testumgebung erstellt werden?
    • Wie gehen Sie mit potenziellen Unterschieden zwischen Test- und Produktionsumgebungen in Bereitstellungsskripten um?
    • Wie testen Sie, ob die Bereitstellungsskripte genauso effektiv gegen die Produktion funktionieren wie im Test?
  2. Welche Arten von Objekten sollten versioniert werden?
    • Nur Code (Prozeduren, Pakete, Trigger, Java usw.)?
    • Indizes?
    • Einschränkungen?
    • Tabellendefinitionen?
    • Tabellenänderungsskripte? (zB ALTER-Skripte)
    • Alles?
  3. Welche Objekttypen sollten nicht versioniert werden?
    • Sequenzen?
    • Zuschüsse?
    • Benutzerkonten?
  4. Wie sollten Datenbankobjekte in Ihrem SCM-Repository organisiert sein?
    • Wie gehen Sie mit einmaligen Dingen wie Konvertierungsskripten oder ALTER-Skripten um?
    • Wie gehen Sie mit dem Löschen von Objekten aus der Datenbank um?
    • Wer sollte für die Förderung von Objekten von der Entwicklung bis zum Test verantwortlich sein?
    • Wie koordinieren Sie Änderungen von mehreren Entwicklern?
    • Wie gehen Sie mit der Verzweigung von Datenbankobjekten um, die von mehreren Systemen verwendet werden?
  5. Welche Ausnahmen, wenn überhaupt, können für diesen Prozess angemessen sein?
    • Sicherheitsprobleme?
    • Daten mit Bedenken hinsichtlich der Identifizierung?
    • Skripte, die nicht vollständig automatisiert werden können?
  6. Wie können Sie den Prozess belastbar und durchsetzbar machen?
    • Zum Entwicklerfehler?
    • Zu unerwarteten Umweltproblemen?
    • Für die Notfallwiederherstellung?
  7. Wie können Sie Entscheidungsträger davon überzeugen, dass die Vorteile von DB-SCM die Kosten wirklich rechtfertigen?
    • Anekdoten?
    • Industrieforschung?
    • Best-Practice-Empfehlungen der Branche?
    • Appelle an anerkannte Behörden?
    • Kosten-Nutzen-Analyse?
  8. Wem sollten Datenbankobjekte in diesem Modell "gehören"?
    • Entwickler?
    • Datenbankadministratoren?
    • Datenanalysten?
    • Mehr als eine?
LBushkin
quelle
3
Die Tiefe dieser Frage bittet um ein Kopfgeld.
Greg D

Antworten:

53

Hier einige Antworten auf Ihre Fragen:

  1. Sollten sowohl Test- als auch Produktionsumgebungen aus der Quellcodeverwaltung erstellt werden? JA
    • Sollten beide mithilfe von Automatisierung erstellt werden - oder sollte die Produktion durch Kopieren von Objekten aus einer stabilen, endgültigen Testumgebung erstellt werden?
    • Automatisierung für beide. Kopieren Sie KEINE Daten zwischen den Umgebungen
    • Wie gehen Sie mit potenziellen Unterschieden zwischen Test- und Produktionsumgebungen in Bereitstellungsskripten um?
    • Verwenden Sie Vorlagen, damit Sie für jede Umgebung unterschiedliche Skriptsätze erstellen (z. B. Verweise auf externe Systeme, verknüpfte Datenbanken usw.).
    • Wie testen Sie, ob die Bereitstellungsskripte genauso effektiv gegen die Produktion funktionieren wie im Test?
    • Sie testen sie in einer Vorproduktionsumgebung: Testen Sie die Bereitstellung auf einer exakten Kopie der Produktionsumgebung (Datenbank und möglicherweise andere Systeme).
  2. Welche Arten von Objekten sollten versioniert werden?
    • Nur Code (Prozeduren, Pakete, Trigger, Java usw.)?
    • Indizes?
    • Einschränkungen?
    • Tabellendefinitionen?
    • Tabellenänderungsskripte? (zB ALTER-Skripte)
    • Alles?
    • Alles und:
      • Vergessen Sie nicht statische Daten (Suchlisten usw.), damit Sie KEINE Daten zwischen Umgebungen kopieren müssen
      • Behalten Sie nur die aktuelle Version der Datenbankskripte bei (natürlich versioniert) und
      • ALTER-Skripte speichern: 1 GROSSES Skript (oder Verzeichnis von Skripten mit dem Namen "Gefällt mir" 001_AlterXXX.sql, damit die Ausführung in natürlicher Sortierreihenfolge von Version A auf B aktualisiert wird)
  3. Welche Objekttypen sollten nicht versioniert werden?
    • Sequenzen?
    • Zuschüsse?
    • Benutzerkonten?
    • siehe 2. Wenn sich Ihre Benutzer / Rollen (oder technischen Benutzernamen) zwischen den Umgebungen unterscheiden, können Sie sie weiterhin mithilfe von Vorlagen skripten (siehe 1.).
  4. Wie sollten Datenbankobjekte in Ihrem SCM-Repository organisiert sein?
    • Wie gehen Sie mit einmaligen Dingen wie Konvertierungsskripten oder ALTER-Skripten um?
    • siehe 2.
    • Wie gehen Sie mit dem Löschen von Objekten aus der Datenbank um?
    • aus DB gelöscht, aus Trunk / Tip der Quellcodeverwaltung entfernt
    • Wer sollte für die Förderung von Objekten von der Entwicklung bis zum Test verantwortlich sein?
    • Entwicklungs- / Test- / Release-Zeitplan
    • Wie koordinieren Sie Änderungen von mehreren Entwicklern?
    • Versuchen Sie NICHT, für jeden Entwickler eine separate Datenbank zu erstellen. Sie verwenden die Quellcodeverwaltung, richtig? In diesem Fall ändern Entwickler die Datenbank und checken die Skripte ein. Um absolut sicher zu sein, erstellen Sie die Datenbank während des nächtlichen Builds aus den Skripten neu
    • Wie gehen Sie mit der Verzweigung von Datenbankobjekten um, die von mehreren Systemen verwendet werden?
    • schwierige Frage: versuchen Sie um jeden Preis zu vermeiden.
  5. Welche Ausnahmen, wenn überhaupt, können für diesen Prozess angemessen sein?
    • Sicherheitsprobleme?
    • Speichern Sie keine Passwörter für test / prod. Sie können es für Entwickler zulassen, insbesondere wenn Sie tägliche / nächtliche DB-Neuerstellungen automatisiert haben
    • Daten mit Bedenken hinsichtlich der Identifizierung?
    • Skripte, die nicht vollständig automatisiert werden können?
    • dokumentieren und mit dem Release-Info / ALTER-Skript speichern
  6. Wie können Sie den Prozess belastbar und durchsetzbar machen?
    • Zum Entwicklerfehler?
    • getestet mit täglichem Build von Grund auf neu und vergleichen Sie die Ergebnisse mit dem inkrementellen Upgrade (von Version A nach B mit ALTER). Vergleichen Sie sowohl das resultierende Schema als auch die statischen Daten
    • Zu unerwarteten Umweltproblemen?
    • Verwenden Sie Versionskontrolle und Backups
    • Vergleichen Sie das PROD-Datenbankschema mit dem, was Sie denken, insbesondere vor der Bereitstellung. SuperDuperCool DBA hat möglicherweise einen Fehler behoben, der noch nie in Ihrem Ticketsystem vorhanden war :)
    • Für die Notfallwiederherstellung?
  7. Wie können Sie Entscheidungsträger davon überzeugen, dass die Vorteile von DB-SCM die Kosten wirklich rechtfertigen?
    • Anekdoten?
    • Industrieforschung?
    • Best-Practice-Empfehlungen der Branche?
    • Appelle an anerkannte Behörden?
    • Kosten-Nutzen-Analyse?
    • Wenn Entwickler und Datenbankadministratoren übereinstimmen, müssen Sie meiner Meinung nach niemanden überzeugen (es sei denn, Sie benötigen Geld, um eine Software wie einen dbGhost für MSSQL zu kaufen ).
  8. Wem sollten Datenbankobjekte in diesem Modell "gehören"?
    • Entwickler?
    • Datenbankadministratoren?
    • Datenanalysten?
    • Mehr als eine?
    • Normalerweise genehmigen Datenbankadministratoren das Modell (vor dem Einchecken oder nach dem Einchecken im Rahmen der Codeüberprüfung). Sie besitzen definitiv leistungsbezogene Objekte. Aber im Allgemeinen besitzt es das Team [und natürlich den Arbeitgeber :)]
van
quelle
Danke für deine Antwort! Glauben Sie, dass diese Empfehlungen für alle Projekte gelten? Kennen Sie Tools, mit denen Sie diesen Automatisierungsgrad erreichen können? Ich werde meine Frage aktualisieren, wenn mehr Leute darüber nachdenken. Beachten Sie auch, dass meine "Teaser" -Fragen nicht als endgültige Liste von Anliegen gedacht waren, sondern vielmehr als Ausgangspunkt für Diskussionen.
LBushkin
Klar. Ich denke, Sie haben eine sehr, sehr gute Frage aufgeworfen. Und ich hoffe wirklich, dass die Frage genug Anklang findet, damit Sie ein großartiges HowTo-Wiki zu diesem Thema zusammenstellen können. ---- aus den Tools: Ich habe dbGhost von Innovartis verwendet, das ich in den Antworten für die Verwaltung des MSSQL-Servers erwähnt habe, und es hat großartige Arbeit geleistet. Es gibt wahrscheinlich andere Tools für den Job, aber da das vollständige SQL-Schema bei Anbietern nicht wirklich Standard ist, gibt es keine All-in-One-Lösung (für alle SCM- und RDMBS-Programme).
van
Gute Antwort. Ich gehe davon aus, dass "Listen nachschlagen" die Daten bedeutet, die zum Auffüllen von <select> -Feldern verwendet werden. Dies ist möglicherweise nicht immer möglich, da diese Daten möglicherweise von Benutzern (auf irgendeine Weise) in der Produktion geändert werden. In diesem Fall ist es sinnvoll, Backups zu erstellen. Sie schlagen außerdem vor, die Datenbank im Rahmen eines nächtlichen Builds von Grund auf neu zu erstellen. Ich denke nicht, dass das eine gute Idee ist; Es kann laufende Arbeiten löschen oder eine Neuinstallation / Konfiguration anderer Software erfordern. Schließlich würde ich vorschlagen, Testmodi, Datenvalidatoren und andere Tools zu erstellen, anstatt sie von Grund auf neu zu erstellen, um ausfallsichere Prozesse sicherzustellen.
Richard Levasseur
@ Richard. Gute Punkte, aber trotzdem. Wenn Sie "Datenbank von Grund auf neu erstellen" lesen, bedeutet dies nicht immer, dass die Daten gelöscht werden. Es dient dazu, das Schema und die statischen Daten neu zu erstellen. Wenn einige Arbeiten in Bearbeitung sind (in Bezug auf Schema oder statische Daten), sollte diese in der Quellcodeverwaltung enthalten sein, damit sie Teil des nächtlichen Builds ist. Wenn Sie in der Branche mit umfangreichem DB-Redesign arbeiten, verfügen Sie über eine separate Datenbank für diese Art der Entwicklung. Und wenn Sie Unit-Tests verwenden, verlassen Sie sich nicht auf den Datenstatus in der Datenbank, sondern erstellen / löschen als Teil von db-unit-test. --- Statische Daten, die von Benutzern ausgegeben werden - stimmen zu.
van
Ich bin nicht damit einverstanden, jede Nacht Datenbanken neu aufzubauen. Während alles, was die Datenbank definiert, wie Schemas, Trigger, gespeicherte Prozeduren und bestimmte statische "verwaltete" Daten, in Skripten geschrieben werden sollte, sollte das eigentliche Material nicht sein. Der Inhalt selbst kann durch Entwickler-Tasking gesteuert werden. Wir haben Entwickler, die an Datensätzen zum Testen und Experimentieren arbeiten. Was wäre, wenn sie jeden Tag hereinkämen und ihr aktueller Zustand "zurückgesetzt" würde? Nicht gut. Ich verwende TestNG-Tests, die bestimmte Tabellen löschen und dann jeden Tag mit Testdaten vorladen. Klingt nicht nach einem Kandidaten für die Quellcodeverwaltung.
Gregturn
5

Ich behandle das SQL wenn möglich als Quellcode

Wenn ich es in standardkonformem SQL schreiben kann, wird es im Allgemeinen in einer Datei in meiner Quellcodeverwaltung gespeichert. Die Datei definiert so viel wie möglich, z. B. SPs, Table CREATE-Anweisungen.

Ich füge auch Dummy-Daten zum Testen in die Quellcodeverwaltung ein:

  1. proj / sql / setup_db.sql
  2. proj / sql / dummy_data.sql
  3. proj / sql / mssql_specific.sql
  4. proj / sql / mysql_specific.sql

Und dann abstrahiere ich alle meine SQL-Abfragen, damit ich das gesamte Projekt für MySQL, Oracle, MSSQL oder irgendetwas anderes erstellen kann.

Die Build- und Testautomatisierung verwendet diese Build-Skripte, da sie genauso wichtig sind wie die App-Quelle und testet alles von der Integrität über Trigger, Prozeduren und Protokollierung.

Aiden Bell
quelle
4

Wir nutzen die kontinuierliche Integration über TeamCity. Bei jedem Einchecken in die Quellcodeverwaltung werden die Datenbank und alle Testdaten von Grund auf neu erstellt, dann der Code und anschließend die Komponententests für den Code ausgeführt. Wenn Sie ein Codegenerierungstool wie CodeSmith verwenden, kann es auch in Ihren Erstellungsprozess eingefügt werden, um Ihre Datenzugriffsschicht bei jedem Build neu zu generieren. So stellen Sie sicher, dass alle Ihre Schichten "übereinstimmen" und keine Fehler aufgrund von erzeugen Nicht übereinstimmende SP-Parameter oder fehlende Spalten.

Jeder Build verfügt über eine eigene Sammlung von SQL-Skripten, die im Verzeichnis $ project \ SQL \ in der Quellcodeverwaltung gespeichert, mit einem numerischen Präfix versehen und der Reihe nach ausgeführt werden. Auf diese Weise üben wir unser Bereitstellungsverfahren bei jedem Build.

Abhängig von der Nachschlagetabelle werden die meisten unserer Nachschlagewerte auch in Skripten gespeichert und ausgeführt, um sicherzustellen, dass die Konfigurationsdaten den Erwartungen entsprechen, z. B. "reason_codes" oder "country_codes". Auf diese Weise können wir eine Änderung der Suchdaten in dev vornehmen, sie testen und dann durch Qualitätssicherung und Produktion "fördern", anstatt ein Tool zum Ändern der Suchwerte in der Produktion zu verwenden, was für die Betriebszeit gefährlich sein kann.

Wir erstellen auch eine Reihe von "Rollback" -Skripten, die unsere Datenbankänderungen rückgängig machen, falls ein Build für die Produktion schief geht. Sie können die Rollback-Skripte testen, indem Sie sie ausführen und anschließend die Komponententests für die Build-One-Version unter Ihrer erneut ausführen, nachdem die Bereitstellungsskripts ausgeführt wurden.

Chris McCall
quelle
4

+1 für Liquibase : LiquiBase ist eine datenbankunabhängige Open Source (LGPL) -Bibliothek zum Verfolgen, Verwalten und Anwenden von Datenbankänderungen. Es basiert auf einer einfachen Prämisse: Alle Datenbankänderungen (Struktur und Daten) werden in einer XML-basierten beschreibenden Weise gespeichert und in die Quellcodeverwaltung eingecheckt. Der gute Punkt ist, dass DML-Änderungen nicht nur diff, sondern semantisch gespeichert werden, damit Sie den Zweck der Änderungen verfolgen können.

Es könnte zur besseren Interaktion mit der GIT- Versionskontrolle kombiniert werden . Ich werde unsere Dev-Prod-Umgebung so konfigurieren, dass sie es ausprobiert.

Sie können auch Maven, Ant- Build-Systeme zum Erstellen von Produktionscode aus Skripten verwenden.

Das Minus ist, dass LiquiBase nicht in weit verbreitete SQL-IDEs integriert ist und Sie grundlegende Operationen selbst ausführen sollten.

Darüber hinaus können Sie DBUnit für DB-Tests verwenden. Mit diesem Tool können Datengenerierungsskripts zum Testen Ihrer Produktionsumgebung mit anschließender Bereinigung verwendet werden.

MEINER BESCHEIDENEN MEINUNG NACH:

  1. Speichern Sie DML in Dateien, damit Sie sie versionieren können.
  2. Automatisieren Sie den Schemaerstellungsprozess über die Quellcodeverwaltung.
  3. Zu Testzwecken kann der Entwickler eine lokale Datenbank verwenden, die aus der Quellcodeverwaltung über das Buildsystem erstellt wurde + Lasttestdaten mit Skripten oder DBUnit-Skripten (aus der Quellcodeverwaltung).
  4. Mit LiquiBase können Sie eine "Ausführungssequenz" von Skripten bereitstellen, um Abhängigkeiten zu berücksichtigen.
  5. Es sollte ein DBA-Team geben, das den Master-Brunch mit ALLEN Änderungen vor der Verwendung in der Produktion überprüft. Ich meine, sie überprüfen Trunk / Branch von anderen DBAs, bevor sie sich auf MASTER Trunk festlegen. So ist dieser Master immer konsequent und produktionsbereit.

Wir hatten alle genannten Probleme mit Codeänderungen, Zusammenführen und Umschreiben in unserer Abrechnungsproduktionsdatenbank. Dieses Thema ist großartig, um all diese Dinge zu entdecken.

zmische
quelle
3

Wenn Sie "Teaser-Fragen" stellen, scheinen Sie mehr an einer Diskussion interessiert zu sein als an der Meinung einer Person zu endgültigen Antworten. Die aktive Mailingliste agileDatabases (> 2500 Mitglieder) hat viele dieser Fragen beantwortet und ist meiner Erfahrung nach ein anspruchsvolles und ziviles Forum für diese Art von Diskussion.

Glenn
quelle
Ich halte es für unwahrscheinlich, dass eine einzige, allgemein vereinbarte Antwort erreicht werden kann. Aber ich möchte einige gemeinsame Bereiche der Übereinstimmung identifizieren - und vielleicht eine vernünftige Empfehlung zusammenstellen. Ich werde mir auf jeden Fall auch das agileDatabases-Forum ansehen, danke.
LBushkin
3

Grundsätzlich stimme ich jeder Antwort von van zu . Für weitere Einblicke ist meine Basis für das Datenbankmanagement die K. Scott Allen-Serie (ein Muss, IMHO. Und Jeffs Meinung scheint es auch).

  • Datenbankobjekte können jederzeit von Grund auf neu erstellt werden, indem eine einzelne SQL-Datei gestartet wird (die selbst andere SQL-Dateien aufrufen kann) : Create.sql. Dies kann das Einfügen statischer Daten (Listen ...) umfassen.
  • Die SQL-Skripte sind so parametrisiert, dass keine umgebungsabhängigen und / oder vertraulichen Informationen in einfachen Dateien gespeichert werden.
  • Ich verwende eine benutzerdefinierte Batch-Datei zum Starten von Create.sql: Create.cmd. Das Ziel besteht hauptsächlich darin, nach Voraussetzungen (Tools, Umgebungsvariablen ...) zu suchen und Parameter an das SQL-Skript zu senden. Es kann auch statische Daten aus CSV-Dateien für Leistungsprobleme in großen Mengen laden .
  • In der Regel werden Systembenutzeranmeldeinformationen als Parameter an die Create.cmdDatei übergeben.

IMHO sollte das dynamische Laden von Daten abhängig von Ihrer Umgebung einen weiteren Schritt erfordern. Entwickler möchten ihre Datenbank mit Test-, Junk- oder gar keinen Daten laden, während Produktionsmanager am anderen Ende Produktionsdaten laden möchten. Ich würde in Betracht ziehen, Testdaten auch in der Quellcodeverwaltung zu speichern (um beispielsweise das Testen von Einheiten zu vereinfachen).

Sobald die erste Version der Datenbank in Produktion gegangen ist, müssen Sie nicht nur Skripte erstellen (hauptsächlich für Entwickler), sondern auch Skripte aktualisieren (basierend auf denselben Prinzipien):

  • Es muss eine Möglichkeit geben, die Version aus der Datenbank abzurufen (ich verwende eine gespeicherte Prozedur, aber eine Tabelle würde dies auch tun).
  • Bevor ich eine neue Version veröffentliche, erstelle ich eine Upgrade.sqlDatei (die andere aufrufen kann), mit der Version N-1 auf Version N aktualisiert werden kann (N ist die Version, die veröffentlicht wird). Ich speichere dieses Skript unter einem Ordner mit dem Namen N-1.
  • Ich habe eine Batch-Datei, die das Upgrade durchführt : Upgrade.cmd. Es kann die aktuelle Version (CV) der Datenbank über eine einfache SELECT-Anweisung abrufen, das Upgrade.sqlunter dem CVOrdner gespeicherte Skript starten und eine Schleife ausführen, bis kein Ordner mehr gefunden wird. Auf diese Weise können Sie automatisch ein Upgrade von beispielsweise N-3 auf N durchführen.

Probleme damit sind:

  • Abhängig von den Datenbankanbietern ist es schwierig, Datenbankschemata automatisch zu vergleichen. Dies kann zu unvollständigen Upgrade-Skripten führen.
  • Jede Änderung der Produktionsumgebung (normalerweise von DBAs zur Leistungsoptimierung) sollte auch den Weg zur Quellcodeverwaltung finden. Um dies sicherzustellen, ist es normalerweise möglich, jede Änderung über einen Trigger in der Datenbank zu protokollieren. Dieses Protokoll wird nach jedem Upgrade zurückgesetzt.
  • Im Idealfall sollten vom DBA initiierte Änderungen jedoch nach Möglichkeit Teil des Release- / Upgrade-Prozesses sein.

Welche Art von Datenbankobjekten möchten Sie unter Quellcodeverwaltung haben? Nun, ich würde so viel wie möglich sagen, aber nicht mehr ;-) Wenn Sie Benutzer mit Kennwörtern erstellen möchten, geben Sie ihnen ein Standardkennwort (Login / Login, praktisch für Unit-Testzwecke) und ändern Sie das Passwort manuell . Dies passiert häufig bei Oracle, wo Schemas auch Benutzer sind ...

Mac
quelle
1

Wir haben unser Silverlight-Projekt mit MSSQL-Datenbank in der Git-Versionskontrolle. Am einfachsten ist es, sicherzustellen, dass Sie eine abgespeckte Datenbank haben (inhaltlich), und einen vollständigen Speicherauszug von z. B. Visual Studio zu erstellen. Anschließend können Sie in Ihrem Build-Skript 'sqlcmd' ausführen, um die Datenbank auf jedem Entwicklungscomputer neu zu erstellen.

Für die Bereitstellung ist dies nicht möglich, da die Datenbanken zu groß sind. Dies ist der Hauptgrund dafür, dass sie überhaupt in einer Datenbank gespeichert sind.

Rutger Nijlunsing
quelle
1

Ich bin der festen Überzeugung, dass eine Datenbank Teil der Quellcodeverwaltung und zu einem großen Teil Teil des Erstellungsprozesses sein sollte. Wenn es sich um eine Quellcodeverwaltung handelt, habe ich beim Schreiben einer gespeicherten Prozedur in SQL dieselben Codierungssicherungen wie beim Schreiben einer Klasse in C #. Dazu füge ich ein DB-Skriptverzeichnis in meinen Quellbaum ein. Dieses Skriptverzeichnis enthält nicht unbedingt eine Datei für ein Objekt in der Datenbank. Das wäre ein Schmerz im Hintern! Ich entwickle in meiner Datenbank nur ein, was ich in meinem Code-Projekt tun würde. Wenn ich dann zum Einchecken bereit bin, mache ich einen Unterschied zwischen der letzten Version meiner Datenbank und der aktuellen, an der ich arbeite. Ich benutze dafür SQL Compare und es generiert ein Skript aller Änderungen. Dieses Skript wird dann mit einer bestimmten Namenskonvention in meinem Verzeichnis db_update gespeichert. 1234_TasksCompletedInThisIteration wobei die Nummer die nächste Nummer in der Gruppe der bereits vorhandenen Skripte ist und der Name beschreibt, was beim Einchecken getan wird. Ich mache dies auf diese Weise, weil als Als Teil meines Erstellungsprozesses beginne ich mit einer neuen Datenbank, die dann programmgesteuert mit den Skripten in diesem Verzeichnis erstellt wird. Ich habe eine benutzerdefinierte NAnt-Aufgabe geschrieben, die jedes Skript durchläuft und seinen Inhalt auf der nackten Datenbank ausführt. Wenn ich Daten benötige, um in die Datenbank zu gelangen, habe ich natürlich auch Skripte zum Einfügen von Daten. Dies hat auch viele Vorteile. Erstens sind alle meine Sachen versioniert. Zweitens ist jeder Build ein neuer Build, was bedeutet, dass keine hinterhältigen Dinge in meinen Entwicklungsprozess eindringen (z. B. schmutzige Daten, die zu Kuriositäten im System führen). Drittens, wenn ein neuer Mann zum Entwicklerteam hinzugefügt wird, muss er einfach auf dem neuesten Stand sein und sein lokaler Entwickler wird im laufenden Betrieb für ihn gebaut. Viertens kann ich Testfälle (ich habe es nicht als "Komponententest" bezeichnet!) In meiner Datenbank ausführen, da der Status der Datenbank bei jedem Build zurückgesetzt wird (was bedeutet, dass ich meine Repositorys testen kann, ohne mir Gedanken über das Hinzufügen von Testdaten zu der Datenbank machen zu müssen db).

Dies ist nicht jedermanns Sache.

Dies ist nicht für jedes Projekt. Normalerweise arbeite ich an Projekten auf der grünen Wiese, was mir diese Bequemlichkeit ermöglicht!

Andrew Siemer
quelle
Schön zu hören, dass Sie SQL Compare als Teil Ihres Datenbankentwicklungslebenszyklus verwenden. Wir glauben, dass wir es Entwicklern möglicherweise leichter gemacht haben, neue Änderungen zu erhalten. Überprüfen Sie die SQL-Quellcodeverwaltung. Dies funktioniert neben SQL Compare, um die Zusammenarbeit mit Entwicklern zu vereinfachen und die Quellcodeverwaltung Ihrer Schemaobjekte zu gewährleisten (vorausgesetzt, Sie verwenden SVN oder TFS). red-gate.com/products/sql_source_control/index.htm
David Atkinson
1

Anstatt auf Argumente des weißen Turms einzugehen, ist hier eine Lösung, die für mich bei Problemen der realen Welt sehr gut funktioniert hat.

Das Erstellen einer Datenbank von Grund auf kann als Verwaltung von SQL-Skripten zusammengefasst werden.

DBdeploy ist ein Tool, das den aktuellen Status einer Datenbank überprüft - z. B. welche Skripte zuvor ausgeführt wurden, welche Skripte zur Ausführung verfügbar sind und welche Skripte daher ausgeführt werden müssen.

Anschließend werden alle erforderlichen Skripte zusammengestellt und ausgeführt. Anschließend wird aufgezeichnet, welche Skripte ausgeführt wurden.

Es ist nicht das schönste oder komplexeste Werkzeug - aber mit sorgfältiger Verwaltung kann es sehr gut funktionieren. Es ist Open Source und leicht erweiterbar. Sobald das Ausführen der Skripte ordnungsgemäß erledigt ist, können einige zusätzliche Komponenten wie ein Shell-Skript, das die neuesten Skripte auscheckt und dbdeploy für eine bestimmte Instanz ausführt, problemlos hinzugefügt werden.

Eine gute Einführung finden Sie hier:

http://code.google.com/p/dbdeploy/wiki/GettingStarted

Pablojim
quelle
0

Sie können feststellen , dass Liquibase viele Griffe , was Sie suchen.

David Plumpton
quelle
0

Jeder Entwickler sollte über eine eigene lokale Datenbank verfügen und die Quellcodeverwaltung verwenden, um sie im Team zu veröffentlichen. Meine Lösung ist hier: http://dbsourcetools.codeplex.com/ Viel Spaß, - Nathan

Nathan Rozentals
quelle