Delphi-PRAXiS
Seite 1 von 2  1 2      

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:16 Uhr.
Seite 1 von 2  1 2      

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