2009-02-15 11 views
10

Ich arbeite an einer AIR-Anwendung, die eine lokale SQLite-Datenbank verwendet und frage mich, wie ich Datenbankschemaaktualisierungen verwalten kann, wenn ich neue Versionen der Anwendung vertreibe. Beachten Sie auch Updates, die einige Versionen überspringen. Z.B. anstatt von 1,0 auf 1,1 zu wechseln, von 1,0 auf 1,5.Datenbankschemaaktualisierungen

Welche Technik würden Sie empfehlen?

Antwort

7

Wir Skript jede DDL Änderung der DB und wenn wir machen eine „Freigabe“ wir sie zu einem einzigen „Upgrade“ Skript verketten, zusammen mit allen gespeicherten Prozeduren, die „seit dem letzten Mal“ geändert haben

Wir haben eine Tabelle, in der die Versionsnummer des zuletzt verwendeten Patches gespeichert wird - damit die Upgrade-Tools alle neueren Patches anwenden können.

Jede gespeicherte Prozedur befindet sich in einer separaten Datei. Jeder beginnt mit einer "insert" -Anweisung in eine Logging-Tabelle, die den Namen von SProc, Version und "now" speichert. (Tatsächlich wird ein SProc ausgeführt, um dies zu speichern, es ist keine rohe insert-Anweisung).

Manchmal ändern wir während der Bereitstellung manuell einen SProc- oder Rollout-Odds & endet von DEV, und durch den Vergleich der TEST- und PRODUCTION-Datenbanken des Logins können wir überprüfen, ob alle Versionen die gleiche Version haben.

Wir haben auch eine "release" master-database, auf die wir die Updates anwenden, und wir verwenden eine wiederhergestellte Sicherung für Neuinstallationen (spart die Zeit für die Ausführung der Skripts, die sich mit der Zeit erhöhen). Wir aktualisieren das als & wenn, denn offensichtlich, wenn es ein bisschen altbacken ist, können die späteren Patch-Skripte angewendet werden.

Unsere Release-Datenbank auch hygienisiert enthält Starterdaten (die gelöscht wird, oder manchmal angenommen & geändert, bevor eine neue Installation live geschaltet wird - so ist dies nicht in allen Update-Skripte enthalten)

SQL Server eine Schaltfläche in der Symbolleiste hat Um Änderungen zu ändern, können Sie die GUI-Tools verwenden, um alle Änderungen vorzunehmen. Anstatt sie zu speichern, generieren Sie stattdessen ein Skript. (Tatsächlich gibt es eine Checkbox immer ein Skript generieren, wenn Sie also vergessen und einfach drücken Sie Speich es gibt Ihnen noch das Skript es verwendet After-the-fact, die als Patch-Datei gespeichert werden können)

+0

+1. Ich folge einem ähnlichen Prozess und es funktioniert gut. –

+0

+1. Wir folgen ähnlichen Prozessen und haben ein Tool namens SQL Deploy, das uns sehr hilft –

1

IMO die einfachste Sache zu tun ist, ein Update von z. 1,0 bis 1,5 als eine Folge von Aktualisierungen von 1,0 bis 1,1, 1,1 bis 1,2 und so weiter. Bewahren Sie für jede Versionsänderung ein Konvertierungsscript/Codeteil auf.

Dann halten Sie eine Tabelle mit einem Versionsfeld in der Datenbank, und kompilieren Sie in der App die erforderliche Version. Wenn das Versionsfeld nicht mit der kompilierten Version übereinstimmt, führen Sie beim Start nacheinander alle erforderlichen Konvertierungsskripts aus.

Die Konvertierungsscripts sollten idealerweise eine Transaktion starten und die neue Version als letzte Anweisung in die Datenbank schreiben, bevor die Transaktion abgeschlossen wird.

1

Was ich überlege, ist das Hinzufügen einer SchemaVersion-Tabelle zur Datenbank, die einen Datensatz für jede vorhandene Version enthält. Die letzte Version der SchemaVersion-Tabelle ist die aktuelle Ebene der Datenbank.

Ich werde (SQL) Skripte erstellen, die die Ersteinrichtung von 1,0 und danach wurde das Upgrade von 1,0 bis 1,1 1,1 bis 1,2 usw.

Auch eine frisch zum Beispiel installieren ausführen 1.2 wird alle diese Skripts durchlaufen. Dies mag etwas langsam erscheinen, wird aber nur einmal und in einer (fast) leeren Datenbank ausgeführt.

Der große Vorteil davon ist, dass eine Neuinstallation dasselbe Datenbankschema wie eine aktualisierte Installation hat.

Wie gesagt: Ich denke darüber nach. Ich werde wahrscheinlich morgen mit der Umsetzung beginnen. Wenn Sie interessiert sind, kann ich meine Erfahrungen teilen. Ich werde dies für eine C# -Anwendung implementieren, die LINQ-to-Entities mit SQL Server und MySQL als DBMS verwendet.

Ich bin daran interessiert, die Vorschläge und Ideen anderer zu hören, und wenn mir jemand eine Open Source .Net-Bibliothek oder Klassen zeigen könnte, die so etwas implementieren, wäre das großartig.

EDIT: In der Antwort auf eine andere question here on SO fand ich einen Verweis auf Migrator.Net. Ich habe es heute benutzt und es sieht so aus, als ob es genau das ist, wonach ich gesucht habe.

20

Im Fall von SQLite können Sie das Pragma user_version verwenden, um die Version der Datenbank zu verfolgen. Um die Version zu erhalten:

PRAGMA user_version 

, um die Version festgelegt:

PRAGMA user_version = 5 

ich dann jede Gruppe von Updates in einer SQL-Datei halten (das in der App eingebettet ist) und das Updates laufen muß aufstehen auf die neueste Version:

Select Case currentUserVersion 
Case 1 
    // Upgrade to version 2 
Case 2 
    // Upgrade to version 3 
Case etc... 
End Select 

Dies ermöglicht die App selbst auf die aktuellste Version unabhängig von der aktuellen Version des DB zu aktualisieren.

0

Ich hatte das gleiche Problem in einer .net-Anwendung, die ich schrieb.

Am Ende schrieb ich mein eigenes Upgrade-Framework, um die Arbeit zu tun (wird nicht für Sie arbeiten, weil es in C# geschrieben wurde). Sie können in link text suchen, um einige Ideen zu erhalten.