Einzelnen Beitrag anzeigen

Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.611 Beiträge
 
#5

Re: Tabellenstruktur (MSSQL) bei Update überprüfen

  Alt 22. Nov 2006, 20:30
Zitat von winnionkel:
Ich hatte so in der Art gedacht, ob der SQL Server das anhand einer Deffinitionsdatei, eventuell allein machen könnte.
Huh. Soweit ich weiss kann DAS kein DBMS.

Was die Performance angeht: Selbst mit Tabellen im GB-Bereich ist sowas kein Problem. Vor allem die Systemtabellen zum Abgleich sind, da IMMER gecached, superschnell abgefragt. Und es reicht ja, die einmal in eine Memtable zu laden und dort dann auf fehlende Fehler zu vergleichen.

Aber mal ne ganz andere Frage: Warum so kompliziert?

Vorschlag:
Wenn Du sowas wie eine Konfigurationstabelle hast hier einen Wert 'DBVersion' anlegen. Wenn Du keine Konfigtabelle hast, diese Anlegen und diesen Wert anlegen.

Eine Version des Datenbanklayouts bekommt ab dann immer eine definierte Version, die in dieser Konfig abgelegt wird.

Änderst Du Deine Tabellen, erhöhst Du die Datenbankversion. Die nötigen Scripte zum ändern (ALTER TABLE..., zur not mit Umweg über temp-tabelle wenns gröbere Änderungen sind etc.) lieferst Du immer alle mit dem Client aus - entsprechend der alten(!) Datenbankversion benamst. Letztes Statement ist freilich das updaten des DBVersion-Wertes auf die neue DB-Version.

Jeder Client benötigt dann einfach eine bestimmte Datenbankversion, die einfach aus dem DBVersion ausgelesen werden kann.

Zum Start des Client überprüft dieser die Version. Ist diese gleich der benötigten ist alles okay. Ist diese kleiner, wird das vorliegende Script zur aktuell eingetragenen DBVersion ausgeführt und danach der Wert nochmal abgefragt. Ist er immer noch kleiner wird das nächste Skript ausgeführt... bis die DBVersion am schluss mit der richtigen vom Client verlangten Version übereinstimmt.

Somit hast Du die Datenbank inkrementell immer auf dem aktuellsten Stand (selbst wenn ein Kunde mal 2 Versionen aussetzt bekommt er alle updates) und das läuft mit der Auslieferung einer neuen Clientversion auch vollautomatisch ab.

Wichtig ist nur, dass dann nicht zwei Clients gleichzeitig versuchen, upzudaten. Also müsstest Du den DBversion-Eintrag halt explizit vom ersten Client aus locken. Wenn schon gelockt ist kann der nächste Client keinen Lock bekommen und mnacht kein update sondern wartet bis der Lock wieder weg ist.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat