Autor Beitrag
funcry
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: Mi 25.06.08 11:49 
Bei meinem aktuellen Projekt stehe ich vor dem Problem dass ich die Datenbank erweitern muss.

Jetzt suche ich nach einer sauberen Lösung.

Aktueller Stand:
Momentan habe ich ein sauberes SQL-script welches die Datenbank mit allen Indexen, Triggern, etc. erstellt. Die Datenbak ist seit ein paar Monaten im Einsatz und daher mit Daten gefüllt (Firebird 2.1).

Was ist ein sauberer Weg eine Tabelle um die neuen benötigten Spalten (teilweise auch Indexen, Fremdschlüssel, Domains, Triggern, SP, etc.) zu erweitern ?

Denkbar wäre das über das Programm zu machen, nur erscheint mir diese Lösung als recht unsabuer, da dadurch die Übersicht meines Scriptes verloren ginge. Das Script nehme ich immer gerne zu Hand während der Programmierung, da es sehr übersichtlich ist.

Was ich noch nicht ausprobiert habe wäre der Weg die Datenbank zu sichern, danach neu zu erstellen - mit den neuen Datenbankfeldern - und dann wieder rückzusichern.
mkinzler
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 4106
Erhaltene Danke: 13


Delphi 2010 Pro; Delphi.Prism 2011 pro
BeitragVerfasst: Mi 25.06.08 11:58 
Du könntest das Skript ja vom Programm ausführen lassen.
Am Besten Versionierung der DB. U.U. Erzeugung von neuere Datenbank mit neuer Struktur und dann anschließend den Inhalt in neue kopieren

_________________
Markus Kinzler.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mi 25.06.08 20:21 
Ich halte das bei all meinen Datenbankanwendungen so:
In der Datenbank gibt es eine Tabelle DB_VERSION. Dort steht eine Versionsnummer, sowie eine Notiz für mich selber, was alles geändert wurde.

Im Programm habe ich nun ein eigenes Datenmodul für DB Updates. Nach dem Verbinden der Datenbank prüfe ich, ob die Version gleich meiner erwarteten ist. Wenn ja, ganz normal weiter arbeiten, wenn nicht werden nacheinander die notwendigen Update Scripte ausgeführt. Diese Scripte habe ich pro Version auf dem Datenmodul angelegt, ist also nocht relativ übersichtlich.

Beispiel:
Ich habe eine Datenbank Version 1. Nun stelle ich fest, dass in dieser DB was geändert werden muss. Also mach ich eine Kopie von der V1, nenn diese V2, und füg dort alle Änderungen ein. Wenn ich fertig bin, lass ich die Metadaten der beiden Datenbanken vergleichen und das ist dann mein Script, was ich in der anwendung als neues Script anlege.

Hoffe, das reicht als Denkanstoß :D
hazard999
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 162

Win XP SP2
VS 2010 Ultimate, CC.Net, Unity, Pex, Moles, DevExpress eXpress App
BeitragVerfasst: Do 26.06.08 08:45 
Hallo,

ich habe das Problem folgendermaßen gelöst:

Es existiert eine genaue Beschreibung des Soll-Zustands der Datenbank.

Also: Keine Änderungsscritps sondern eine Beschreibung der Datenbank (Meta-Daten).

Im Zuge des Updates wird die Datenbank mit den neuen Metadaten verglichen und es werden die Instruktionen zum Abgleich dynamisch erstellt.

Danach werden die Änderungsstatements Schritt für Schritt ausgeführt.

Der Aufwand so etwas zu entwickeln ist natürlich nicht gering aber durchaus machbar (Für meine 1. Version hab ich ca. 40 Stunden gebraucht, inzwischen stecken da ca. 200 h Arbeit drinnen (Bugfixing und Erweiterungen (Ich liebe Views die von einander abhängen)).

Zusätzlich existiert natürlich ein komfortabler Editor mit dem man die Meta-Daten ändern kann, Tabellen-Strutkuren, Views, Stored-Procedures, Trigger importiern kann.

_________________
MOV EAX, Result;MOV BYTE PTR [EAX], $B9;MOV ECX, M.Data;MOV DWORD PTR [EAX+$1], ECX;MOV BYTE PTR [EAX+$5], $5A;MOV BYTE PTR [EAX+$6], $51;MOV BYTE PTR [EAX+$7], $52;MOV BYTE PTR [EAX+$8], $B9;MOV ECX, M.Code;MOV DWORD PTR [EAX+$9], ECX
funcry Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 110
Erhaltene Danke: 1

Win7 64, XP 32
C# (VS 2010 EE), Delphi (TD 2006 Win32)
BeitragVerfasst: Fr 27.06.08 11:06 
Vielen Dank für die Antworten und Anregungen. Entsprechend den Vorschlägen bin ich zufersichtlich eine saubere Lösung einbauen zu können.