Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firebird: DDL und DML in einer Transaktion (https://www.delphipraxis.net/153113-firebird-ddl-und-dml-einer-transaktion.html)

hoika 21. Jul 2010 15:40

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
http://tracker.firebirdsql.org/browse/CORE-2512
geht aber ebend jenes nicht.

Weiss jemand darüber Bescheid ?

Danke


Heiko

Bernhard Geyer 21. Jul 2010 16:31

AW: Firebird: DDL und DML in einer Transaktion
 
AFAIK kann DDL nur Oracle in einer speziellen Transaktionsart "verpacken".

tsteinmaurer 21. Jul 2010 17:47

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.

hoika 22. Jul 2010 07:09

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

mkinzler 22. Jul 2010 07:12

AW: Firebird: DDL und DML in einer Transaktion
 
Geht nur in 2 Schritten:
-Neues Feld anlegen
-Update

idefix2 22. Jul 2010 07:25

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.

mkinzler 22. Jul 2010 07:27

AW: Firebird: DDL und DML in einer Transaktion
 
Eigentlich sollte es auch in der selben Tabelle gehen

tsteinmaurer 22. Jul 2010 07:44

AW: Firebird: DDL und DML in einer Transaktion
 
Hallo,

* Neues Feld anlegen (wenn NOT NULL, dann mit DEFAULT Definition)
* COMMIT
* Update ausführen
* COMMIT

Bernhard Geyer 22. Jul 2010 07:47

AW: Firebird: DDL und DML in einer Transaktion
 
Zitat:

Zitat von tsteinmaurer (Beitrag 1036661)
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.

AFAIK kann man bei neueren Oracle's per Rollback DDL's zurücknehmen. Wurde AFAIK mal in einer Ausgabe von "Der Entwickler" beschrieben.

idefix2 23. Jul 2010 09:30

AW: Firebird: DDL und DML in einer Transaktion
 
Zitat:

Eigentlich sollte es auch in der selben Tabelle gehen
Zitat:

* Neues Feld anlegen (wenn NOT NULL, dann mit DEFAULT Definition)
* COMMIT
* Update ausführen
* COMMIT
Er spricht davon ,dass die Tabelle immer in einem definiertem Zustand bleiebn soll - Ich habe das so verstanden, dass er nicht will, dass man auf die Tabelle zugreifen kann, wenn die neue Spalte schon existiert, aber noch nicht die richtigen Werte drinnen stehen.

mkinzler 23. Jul 2010 09:32

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

idefix2 23. Jul 2010 09:48

AW: Firebird: DDL und DML in einer Transaktion
 
hm, da hast Du Recht. Scheint also wirklich nicht zu gehen.

hoika 23. Jul 2010 10:03

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

ULIK 23. Jul 2010 14:05

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

hoika 23. Jul 2010 14:11

AW: Firebird: DDL und DML in einer Transaktion
 
Hallo,

was hat das mit anderen Programmen zu tun ?
Delphi-Quellcode:
Alter Table Table1 Add XXX Not Null

i:= i/0;

Update Table1
Das i:= i/0; ist etwas überspitzt.

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

ULIK 23. Jul 2010 14:55

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

hoika 25. Jul 2010 06:08

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 07:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz