Datenbankbereitstellungsstrategien (SQL Server)
Ich bin auf der Suche nach einem Weg, um die täglichen Implementierungen und halten Sie die Datenbank-Skripte im Einklang mit den releases.
Derzeit haben wir eine ziemlich anständige Art der Bereitstellung unserer Quelle, haben wir die unit, code coverage, continuous integration und rollback-Verfahren.
Das problem ist das die Datenbank-Skripte im Einklang mit einem release. Jeder scheint zu versuchen, das Skript aus auf die Datenbank testen, dann führen Sie Sie auf live, wenn die ORM mappings werden aktualisiert (d.h. die änderungen live geht), dann nimmt die neue Spalte.
Das erste problem ist, dass keines der Skripts geschrieben werden, überall, in der Regel alle "versuche", um Sie in ein Subversion-Ordner, aber einige der fauler Menschen führen Sie einfach das Skript auf Leben und die meiste Zeit, niemand weiß, wer das getan hat, was in die Datenbank.
Das zweite Problem ist, dass wir haben 4 test-Datenbanken und Sie sind IMMER aus der Reihe und der einzige Weg, um wirklich diese Zeile wieder zu tun eine Wiederherstellung aus der live-Datenbank.
Bin ich ein großer Anhänger, dass ein Prozess wie dieser muss einfach sein, unkompliziert und einfach zu verwenden, um zu helfen, ein Entwickler, nicht behindern.
Was ich Suche, sind Techniken/Ideen, die machen es EINFACH für die Entwickler zu aufzeichnen möchten Ihre Datenbank-Skripte, so dass Sie lief als Teil der release-Prozedur. Ein Prozess, der Entwickler würde Folgen wollen.
Irgendwelche stories, use cases oder auch ein link wären hilfreich.
InformationsquelleAutor der Frage |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Für dieses sehr problem ich entschied mich für die Verwendung einer Migrations-tool: Migratordotnet.
Mit Migrationen (in einem tool) haben Sie eine einfache Klasse verwendet, um Ihre änderungen rückgängig zu machen und Ihnen. Hier ist ein Beispiel:
Dieses Beispiel zeigt, wie Sie behandeln können volatile-updates, wie z.B. das hinzufügen einer neuen nicht-null-Spalte in einer Tabelle mit vorhandenen Daten. Dies kann leicht automatisiert werden, und man kann leicht rauf und runter gehen zwischen den Versionen.
Dies war eine wirklich wertvolle Ergänzung für unser build-und hat sich gestrafft, den Prozess immens.
Ich gepostet ein Vergleich der verschiedenen Migrations-frameworks .NET hier: http://benscheirman.com/2008/06/net-database-migration-tool-roundup
InformationsquelleAutor der Antwort Ben Scheirman
Lesen K. Scott Allen s-Serie von posts auf Datenbank-Versionierung.
Wir Bauten ein tool zum anwenden von Datenbank-Skripte in einer kontrollierten Art und Weise, basierend auf den Techniken, die er beschreibt, und es funktioniert gut.
Dies könnte dann dazu verwendet werden, die als Teil der continuous integration-Prozess mit jedem test-Datenbank mit änderungen bereitgestellt werden, wenn ein commit gemacht wird, die URL, die Sie halten die Datenbank-upgrade-scripts. Ich würde vorschlagen, dass ein baseline-Skript-und upgrade-Skripts, so dass Sie können führen Sie immer eine Reihenfolge von Skripten, um eine Datenbank aus der aktuellen version den neuen Staat erforderlich ist.
Dies gilt noch erfordern einige Verfahren und Disziplin von den Entwicklern, obwohl (alle änderungen müssen gerollt werden in eine neue version der Basis-install-Skript und ein patch-Skript).
InformationsquelleAutor der Antwort Hamish Smith
Wir haben mit SQL Vergleichen von RedGate für ein paar Jahre jetzt:
http://www.red-gate.com/products/index.htm
Die pro-version hat eine Kommandozeilen-Schnittstelle, die Sie könnte wahrscheinlich verwenden, um Ihre setup deployment-Verfahren.
InformationsquelleAutor der Antwort Mike K.
Verwenden wir eine modifizierte version der Datenbank, die Versionsverwaltung beschrieben K. Scott Allen. Wir verwenden die Database Publishing Wizard zum erstellen der ursprünglichen baseline-Skript. Dann eine benutzerdefinierte C# - tool basiert auf SQL-SMO-dump der gespeicherten Prozeduren, Ansichten und Funktionen. Skripts ändern, die enthalten das schema und Daten änderungen erstellt durch Red Gate tools. So dass wir am Ende mit einer Struktur wie
Den benutzerdefiniertes Werkzeug erstellt die Datenbank, wenn notwendig, gilt die Grundlinie.sql, falls notwendig, fügt eine SchemaChanges Tabelle, wenn erforderlich, und gilt die Skripts ändern, wie erforderlich, basierend auf dem, was in dem SchemaChanges Tabelle. Dieser Prozess tritt als Teil eines nant-build-Skript jedes mal, wenn man ein deployment erstellen, die über cc.net.
Wenn jemand will, den source-code der schemachanger app kann ich werfen es auf codeplex/google oder wo auch immer.
InformationsquelleAutor der Antwort Todd Smith
Gehen Sie hier:
http://www.codinghorror.com/blog/archives/001050.html
Etwas nach unten Blättern, um die Liste der 5 links zu den odetocode.com website. Fantastische fünf-teilige Serie. Ich würde es als einen Ausgangspunkt, um Ideen zu bekommen und herauszufinden, ein Verfahren, dass die Arbeit für Ihr team.
InformationsquelleAutor der Antwort Clyde
Wenn Sie reden, versuchen zu halten, Datenbank-schemas synchronisiert, versuchen Sie es mit Red Gate SQL Comparison SDK. Erstellen Sie eine temporäre Datenbank, basierend auf ein Skript erstellen (newDb) - das ist, was Sie möchten, dass Ihre Datenbank Aussehen soll. Vergleichen Sie newDb gegen Ihre alte Datenbank (oldDb). Holen Sie sich eine Wandlung aus diesem Vergleich gilt es mit Hilfe von Red Gate. Sie bauen könnten diese upgrade-Prozess in Sie tests, und Sie können versuchen, und Holen Sie sich alle Entwickler einig sind, dass es einen Ort gibt, wo das create-Skript für die Datenbank gehalten wird. Das gleiche Verfahren funktioniert auch für die Aktualisierung Ihrer Datenbank über mehrere Versionen und ausführen von data-migration-Skripte und Prozesse zwischen jedem Schritt (unter Verwendung eines XML-doc zum anzeigen der create-und Daten-migration-Skripte)
Edit: Mit der Roten-Tor-Technik, die Sie nur besorgt sind, erstellen Sie Skripte, die nicht upgrade-Skripts, da der Rote-Tor kommt mit dem upgrade-Skript. Es wird auch lassen Sie Sie fallen, und erstellen Sie Indizes, gespeicherte Prozeduren, Funktionen, etc.
InformationsquelleAutor der Antwort Mike
Sollten Sie überlegen, mit einem build-tool wie MSBuild oder NAnt. Wir verwenden eine Kombination aus CruiseControl.NET, NAnt, und SourceGear Fortress mit unseren Bereitstellungen, einschließlich SQL-Objekte. Die NAnt-db build-task-Aufrufe sqlcmd.exe um die update-Skripte in unsere dev und staging-Umgebungen nachdem Sie überprüft in die Festung.
InformationsquelleAutor der Antwort Robert S.
Verwenden wir Visual Studio for Database Professionals und TFS-version und verwalten unsere Datenbank-Implementierungen. Dies ermöglicht es uns, behandeln unsere Datenbanken genau wie code (Auschecken, Einchecken, sperren, anzeigen, Versionsgeschichte, Zweig -, build -, deploy -, test -, etc.) und sogar in der gleichen Projektmappe Dateien, wenn wir wollen.
Unsere Entwickler können auf die lokalen Datenbanken zu vermeiden, trat sich gegenseitig auf die änderungen in einer freigegebenen Umgebung. Wenn Sie Datenbank überprüfen und änderungen in TFS, haben wir continuous integration, build, test und deploy, um unsere integrierten dev-Umgebung. Wir haben getrennte baut auf release-Zweigen, die zum erstellen von differenziellen deployment-Skripte für jeden weiteren Umgebung.
Später, wenn ein bug entdeckt wird, die in einem release können wir gehen zu einem release branch hotfix den code und Datenbank zur gleichen Zeit.
Dies ist ein großartiges Produkt, aber seine Verabschiedung war behindert früh durch ein Microsoft-marketing-Fehler. Es war ursprünglich ein separates Produkt unter Team-System. Dies bedeutete, um die Funktionen der developer edition und die database edition zur gleichen Zeit, Sie waren erforderlich, um Schritt bis zu den viel teuren Team-Suite-edition. Wir (und viele andere Kunden) gab Microsoft die Trauer über diese, und wir waren sehr froh, dass Sie angekündigt, in diesem Jahr, dass DB Pro wurde gefaltet in der developer editionund das sofort jedermann lizenziert mit developer edition können die Installation der Datenbank-edition.
InformationsquelleAutor der Antwort
Gus leichthin erwähnt DB Geist (oben) – ich zweite es als eine mögliche Lösung.
Einen kurzen überblick, wie mein Unternehmen ist mit DB-Ghost:
Den "update" - Prozess beinhaltet die Erstellung eines sauber "Quell" - DB-und dann (nach dem pre-update-custom-Scripte), ein Vergleich zwischen den schemas der Quell-DB und die Ziel-DB. DB Geist aktualisiert die Ziel-DB zu entsprechen
Wir routinemäßig änderungen an Produktions-DBs (wir haben 14 Kunden in 7 verschiedenen Produktions-Umgebungen), sondern zwangsläufig die Bereitstellung einer großen genug Sammlung von änderungen mit einem DB-Ghost-update ausführbare Datei (erstellt während unser build-Prozess). Jede Produktion änderungen, wurden nicht geprüft-bei Quelle (oder wurden nicht geprüft-in dem entsprechenden Zweig freigegeben) sind VERLOREN. Das hat jeder gezwungen, um den check-in verpasst konsequent.
Zusammenfassen:
Es gibt einige Einschränkungen und einige Einschränkungen in welche Veränderungen sind 'leicht' wird mit diesem tool (eigentlich eine suite von tools im Zusammenhang mit), Sie sind aber alle bedeutend kleiner (zumindest für meine Firma):
InformationsquelleAutor der Antwort
Buch Refactoring Von Datenbanken behebt viele dieser Probleme auf einer konzeptionellen Ebene.
Soweit tools gehen, ich weiß, dass DB Geist funktioniert gut für SQL Server. Ich habe gehört, dass die Daten Dude - edition von Visual Studio hat sich wirklich schon gebessert, auf die neueste Version, aber ich habe keine Erfahrung mit ihm.
Soweit wirklich abziehen continuous integration-Stil Datenbank-Entwicklung, es wird wirklich Ressource instensive wirklich schnell, da die Anzahl von Kopien der Datenbank, die Sie brauchen. Es ist sehr machbar, wenn die Datenbank können auf einer Entwickler-workstation, aber unpraktisch, wenn die Datenbank so groß, dass es bereitgestellt werden muss, über ein Gitter. Tun Sie es bacically muss 1 Kopie der Datenbank pro developer [Entwickler, die DDL-änderungen, nicht nur die änderungen procs] + 6 common kopiert. Die gemeinsame Kopien sind wie folgt:
*Beim kopieren von Datenbanken für DEV/QA/PROD Linien, werden Sie auch brauchen, um ausführen von Skripts zu aktualisieren, test-Daten für die jeweilige Umgebung (z.B. einrichten von Benutzern in QA, QA-team verwendet, um zu testen, aber das existiert nicht in der Produktion).
InformationsquelleAutor der Antwort
Eine mögliche Lösung ist der Blick in die Implementierung von DML-überwachung auf Ihrem test-Datenbanken ist, dann einfach Rollen diejenigen, die audit-logs in ein Skript für die abschließende Prüfung und live-Bereitstellung. SQL Server 2008 erheblich verbessert, die auf DML-überwachung, aber auch SQL Server 2005 unterstützt es per Auslöser.
InformationsquelleAutor der Antwort
Gibt es eine Reihe von links in diesen Postings, ich werde follow-up auf (ich "rollte meinen eigenen" system-Jahren, um zu sehen, wenn es gibt ähnlichkeiten). Eine Sache, die Sie benötigen, und daß ich hoffe, in den hier aufgeführten links, ist Disziplin. Ich weiß nicht Recht sehen, wie jedes automatische system kann funktionieren, wenn jemand etwas verändern kann, jederzeit. (Deine Frage impliziert, dass dies geschehen kann Sie auf Ihren Produktionssystemen, aber offensichtlich, dass nicht wahr sein kann.)
Mit einer person (dem sagenumwobenen "Datenbank-administrator") widmet sich der Aufgabe, die Verwaltung von änderungen an Datenbanken, insbesondere Datenbanken, ist eine sehr häufige Lösung. Für die Aufrechterhaltung der Konsistenz zwischen X Entwicklung und Erprobung von Datenbanken: wenn er/Sie von vielen Benutzern verwendet, wieder einmal sind Sie am besten damit gedient, dass eine einzelne Handlung als "clearing house" für Veränderungen; wenn jeder hat seine eigene Datenbank-Instanz, dann sind Sie dafür verantwortlich, dass es in Ordnung ist, und dass Sie einen zentralen konsistente Datenbank "Quelle" wird kritisch, wenn Sie müssen eine aktualisierte baseline-Datenbank.
Hier ist eine aktuelle Stack-Overflow-post, die von Interesse sein können: wie-zu-aktualisieren-Sie-einen-test-Beispiel-des-sql-server-mit-Produktion-Daten-ohne-mit
InformationsquelleAutor der Antwort
Red-Gate hat ein Papier beschreibt, wie Sie erreichen, build-Automatisierung: http://downloads.red-gate.com/HelpPDF/ContinuousIntegrationForDatabasesUsingRedGateSQLTools.pdf
Dies ist gebaut, um SQL Source Controldie integriert mit SSMS und Ihre vorhandenen source control system.
InformationsquelleAutor der Antwort
Habe ich geschrieben .NET basiertes tool zum handle-Datenbank der Versionsverwaltung in einer automatisierten Weise. Wir wurden mit diesem Werkzeug in der Produktion zu handhaben Roll-out von Datenbank-updates (einschließlich patches), um mehrere Umgebungen, halten Sie ein Protokoll in jeder Datenbank, welche Skripte ausgeführt wurden, und tun es alle in einer automatisierten Weise. Es hat eine Kommandozeilen-Konsole, so dass Sie können erstellen, batch-Skripte, die dieses tool verwenden. Check it out: https://github.com/bmontgomery/DatabaseVersioning
InformationsquelleAutor der Antwort
Für was es Wert ist, das ist ein echtes Beispiel für eine einfache, low-cost Ansatz von meinem ehemaligen Arbeitgeber (und die ich versuche, zu beeindrucken, auf meinem aktuellen Arbeitgeber als grundlegenden ersten Schritt).
Fügen Sie eine Tabelle namens 'DB_VERSION' oder ähnlich. In JEDER upgrade-Skript, fügen Sie eine Zeile an die Tabelle, die können so wenig oder so viele Spalten, wie Sie sehen, passen zu beschreiben, das upgrade aber auf ein minimum, würde ich vorschlagen { VERSION, EXECUTION_DATE, BESCHREIBUNG, EXECUTION_USER }. Jetzt haben Sie einen konkreten Datensatz, was Los ist. Wenn jemand läuft, Ihre eigenen unbefugte Skript würden Sie noch brauchen, um zu Folgen dem Rat von den oben genannten Antworten, aber das ist nur eine einfache Möglichkeit, dramatisch verbessern Ihre vorhandene Versionsverwaltung (d.h. keine).
Nun lassen Sie uns Sie haben eine upgrade-Skript aus v2.1 auf v2.2 der Datenbank und Sie möchten, um zu überprüfen, die einsamen Außenseiter Kerl hat tatsächlich führen Sie es auf seine Datenbank, können Sie nur nach Zeilen, in denen " VERSION = 'v2.2 " und wenn du ein Ergebnis bekommen, laufen Sie nicht diese upgrade-Skript. Gebaut werden kann in einer Konsole-Dienstprogramm app, wenn nötig.
InformationsquelleAutor der Antwort