![]() |
Datenbank: Firebird • Version: 2 • Zugriff über: egal
Firebird: DDL und DML in einer Transaktion
Hallo #,
bisher war ich der Meinung, dass ein Alter Table Tab1 Add Feld1 Char(1) + Update Tab1 Set Feld1='1' in einer Transaktion ausgeführt werden kann. Nach ![]() geht aber ebend jenes nicht. Weiss jemand darüber Bescheid ? Danke Heiko |
AW: Firebird: DDL und DML in einer Transaktion
AFAIK kann DDL nur Oracle in einer speziellen Transaktionsart "verpacken".
|
AW: Firebird: DDL und DML in einer Transaktion
Hallo Heiko,
richtig, DML und DDL sollten in einer Transaktion nicht vermischt werden. In Oracle stellt sich diese Frage gar nicht, weil DDL Statements automatisch committed werden, d.h. hier gibt es über ein Rollback kein zurück. |
AW: Firebird: DDL und DML in einer Transaktion
Hallo,
wie kann ich dann aber eine Tabelle von einem "definierten Zustand" Feld 1, Feld 2 nach Feld 1, Feld 2, Feld 3 (Werte belegt) ändern ? Heiko |
AW: Firebird: DDL und DML in einer Transaktion
Geht nur in 2 Schritten:
-Neues Feld anlegen -Update |
AW: Firebird: DDL und DML in einer Transaktion
Neue Tabelle anlegen (alle Spalten der alten Tabelle + neue Spalte)
Commit Alte in neue Tabelle kopieren Daten in neuer Spalte setzen Commit Alte Tabelle löschen und neue Tabelle umbenennen Commit Das geht allerdings nur, wenn das Löschen der alten Tabelle nicht durch Fremdschlüssel und dgl ausgeschlossen ist. Alternative: Den aktuellen Fortschritt der Transaktion in einer Hilfstabelle speichern. Wenn die Anwendung so kritisch ist, dass während der Änderung keinesfalls andere Prozesse auf die Tabelle zugreifen dürfen, könntest Du über Trigger und eine Environment Variable den Zugriff von anderen Prozessen auf die Tabelle zu verhindern, solange Deine Transaktion im Laufen ist. |
AW: Firebird: DDL und DML in einer Transaktion
Eigentlich sollte es auch in der selben Tabelle gehen
|
AW: Firebird: DDL und DML in einer Transaktion
Hallo,
* Neues Feld anlegen (wenn NOT NULL, dann mit DEFAULT Definition) * COMMIT * Update ausführen * COMMIT |
AW: Firebird: DDL und DML in einer Transaktion
Zitat:
|
AW: Firebird: DDL und DML in einer Transaktion
Zitat:
Zitat:
|
AW: Firebird: DDL und DML in einer Transaktion
Das gleiche Problem besteht aber bei einer neuen Tabelle. Werden in der alten Tabelle Änderungen gemacht, nachdem der Inhalt in die neue Tabelle übertragen wurde fehlen diese anschlissend
|
AW: Firebird: DDL und DML in einer Transaktion
hm, da hast Du Recht. Scheint also wirklich nicht zu gehen.
|
AW: Firebird: DDL und DML in einer Transaktion
Hallo,
jepp, so ist es. Finde ich zwar doof, das es so ist, aber wenn einer der Core-Entwickler sagt "per Design", kann man nix machen *Quellcode runterlad und ändern tu* ... ;) Heiko |
AW: Firebird: DDL und DML in einer Transaktion
Ganz dumme Frage: wozu brauchst Du das überhaupt? Wenn ein Programm die Definition der DB abändert, dann hat in diesem Moment kein anderes Programm gegen die DB zu laufen. Punkt. Alles andere birgt nur das Risiko von korrupten Daten.
Wenn's so kritisch ist, daß andere Programme zugreifen müssen, dann muß man sich andere Lösungen überlegen (umschalten auf eine Standby mit Protokollierung Änderungen und nach Rüchschalten Rücksynchronisation der geschriebenen Datenbanken). Grüße, Uli |
AW: Firebird: DDL und DML in einer Transaktion
Hallo,
was hat das mit anderen Programmen zu tun ?
Delphi-Quellcode:
Das i:= i/0; ist etwas überspitzt.
Alter Table Table1 Add XXX Not Null
i:= i/0; Update Table1 Table1 ist dann in einem undefinierten Zustand. Ändere ich Constraints auf Not Null führt ein nachfolgendes Backup -> Restore wie bekannt zu einem Restore-Fehler (Not Null und trotzdem Null-Werte drin). Heiko |
AW: Firebird: DDL und DML in einer Transaktion
Ach so, jetzt versteh ich dein Problem. Aber ist das wirklich ein Problem? Du führst mit DDL Statements ein DB Update durch. Dieses ist nun durchgelaufen. Nun tritt eine Exception auf bevor Du die Not Null Spalte füllen kannst. Dann sollte dein Exceptionhandler das doch mitkriegen und entsprechend drauf reagieren können?
Bzw. kannst Du ja am Schluß des gesamten Updates noch einmal einen kurzen Check machen, ob alles gefüllt ist. Wenn nicht, Fehler und Reparatur. Oder überseh ich hier etwas? Grüße, Uli |
AW: Firebird: DDL und DML in einer Transaktion
Hallo,
stürzt der Rechner ab nach dem Add Field, muss das Programm beim nächsten Mal wissen, aha, muss ich noch was machen. Korrekt. Heiko |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz