![]() |
Datenbank: Firebird • Version: 2.1.1.17910 • Zugriff über: Zeos 6.6.4
Problem beim Erzeugen einer Tabelle in einer Transaktion
Morgen, ich hab' da mal wieder ein nettes Problemchen.
Ich wollte folgendes tun:
Code:
IMHO sieht das ya ganz logisch aus. Jedoch tritt bei Punkt 3 der Fehler auf, dass die Tabelle XYZ nicht existiert. Ich müsste, damit dies funktioniert, die Transaktion zwischen 2. und 3. abschließen und eine neue starten. Doch dann brauch ich auch keine Transaktionen mehr.
1. Transaktion starten.
2. Tabelle XYZ mittels SQL erzeugen. 3. Datensatz in Tabelle XYZ mittels SQL hinzufügen. 4. Transaktion abschließen. Werden die Befehle für Datendefinition im Bezug auf Transaktionen anders behandelt als Abfragen und Manipulationsbefehle? Nebenbei: Ich nutze von Firebird sowohl die Embedded-Variante als auch den Server. Schon mal danke für die Antworten :-D |
Re: Problem beim Erzeugen einer Tabelle in einer Transaktion
Die Tabelle wird erst beim Commit angelegt. Vorher kann man also nicht auf diese zugreifen.
|
Re: Problem beim Erzeugen einer Tabelle in einer Transaktion
War mir leider schon fast klar. Ist doch aber sch****.
Es geht nämlich darum, dass ich bei einer neuen Version der Software natürlich die vorhandene Datenbank anpassen muss. Wenn also eine neue Tabelle erzeugt werden muss, muss ich das ya tun. Aber wenn beim Update ein Fehler auftritt, will ich ya eigentlich, dass er nicht halbe Sachen in die Datenbank schreibt. Und wie löst man nun sowas, wenn die ach so tollen Transaktionen da nicht helfen? :| |
Re: Problem beim Erzeugen einer Tabelle in einer Transaktion
Erzeuge eine neue Datenbank und kopiere anschliessend den Inhalt der alten in diese
|
Re: Problem beim Erzeugen einer Tabelle in einer Transaktion
Hallo!
Ist dies wirklich so bei Firebird? Ich habe hier leider kein Firebird im Zugriff aber bei DB2 und Oracle funktioniert z. B. folgendes mit Delphi 2006:
Delphi-Quellcode:
Was nach meinem Verständnis einer Transaktion auch vollkommen korrekt ist.
var
ta: TTransactionDesc; begin try SQLConnection1.Connected := True; try ta.TransactionID := 1; ta.GlobalID := 0; ta.IsolationLevel := xilREADCOMMITTED; SQLConnection1.StartTransaction(ta); SQLQuery1.SQL.Text := 'create table TEMP.TEST (id integer)'; SQLQuery1.ExecSQL; SQLQuery1.SQL.Text := 'insert into TEMP.TEST (ID) values (1)'; SQLQuery1.ExecSQL; SQLConnection1.Commit(ta); except SQLConnection1.Rollback(ta); raise; end; finally SQLConnection1.Connected := False; end; Denn eigentlich sollte es so sein, dass man innerhalb einer Transaktion auch alle Änderungen (insert, update, delete, create, drop etc.) der eigenen Tansaktion auch sehen sollte. Gibt es da bei Firebird vielleicht Konfigurationsoptionen? Oder anderen IsolationLevel xilDIRTYREAD probieren? Ansonsten Tabellen erzeugen, Daten einfügen. Sollte dabei etwas schief gehen wieder ein drop table. Grüße |
Re: Problem beim Erzeugen einer Tabelle in einer Transaktion
Oracle kennt kein Transaktionsmanagement bei DDL.
Und ich glaube, daß das bei anderen DBs nicht anders sein dürfte. Sherlock |
Re: Problem beim Erzeugen einer Tabelle in einer Transaktion
Hallo!
Ist jetzt OT. Aber bei mir funktioniert der oben gezeigte Code mit DB2 V7 / V8 und Oracle 9i. Gerade noch getestet. Bei Oracle hatte ich nur mit 'truncate table' Probleme, der schließt nämlich einfach eine offene Transaktion. Grüße |
Re: Problem beim Erzeugen einer Tabelle in einer Transaktion
Mach doch dann bitte ein Rollback, und sag mir ob die Tabelle danach immer noch existiert, oder nicht.
Danke. Sherlock Edit: Oracle: ![]() Daraus: Zitat:
![]() Zitat:
Sherlock |
Re: Problem beim Erzeugen einer Tabelle in einer Transaktion
Hallo!
Ja, diesbezüglich hast Du Recht. Somit funktioniert der Code zwar, aber das der Rollback im Fehlerfalle für 'create table' funktionslos ist wurde von mir nicht bedacht und somit für den TE auch nicht zu gebrauchen. :( Bleibt nur im Fehlerfalle für alle 'create table' dann 'drop table' auszuführen. Grüße |
Re: Problem beim Erzeugen einer Tabelle in einer Transaktion
Als "Datenbank-Neuling" fragt man sich, für was Transaktionen gut sein sollen. Dann weiß man es und wenn man es mal wirklich braucht, kann man es nicht nutzen :roll: ...
Zitat:
(Oder ich handel nach dem Firmenmotto: In der Praxis wird schon kein Fehler auftreten :mrgreen: ...) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:32 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