Hallo zusammen,
unter PHP habe ich mir ein Script gebastelt, dass Tabellen
von einer DB in eine andere kopiert.
Wenn die Tabelle in der Ziel-DB noch nicht vorhanden ist,
dann wird sie halt mit allem Pipapo anhand des Tebellen-Schemas
der Quellen-DB angelegt.
Soweit so gut. Klappt alles wunderbar, bis auf ein Manko.
Wenn die Tabelle in der Ziel-DB noch nicht vorhanden war
und neu angelegt werden musste, bricht das direkt folgende
Kopieren der Daten mit dem Fehler 204 "unknown table" ab.
Fakt ist aber, dass das Anlegen der Tabelle zu diesem Zeitpunkt
schon erfolgreich und fehlerfrei in der Ziel-DB gelaufen ist. Das
wird vorher überprüft.
Auch werden direkt nach dem Anlegen der Tabelle alle Ressourcen
zur Ziel-DB explizit freigegeben, ein Disconnect der Verbindung
zur Ziel-DB gesetzt und anschließend "frisch" neu "connected".
Hilft alles nichts.
Wenn ich aber dann "dasselbe" Script im Browser einfach nur
NEU lade, läutt das Daten-Pumpen OHNE Probleme durch.
Es ist auch egal welchen Treiber ich benutze, ob PEAR-Mdb2,
PDO oder Firebird. Mit allen dasselbe Problem.
Hat jemand eine Idee woran das liegt oder was für einen
Fehler ich mache ?
Gut, es wäre kein Problem das Daten-Pumpen durch ein
anderes Script in einem frischen Browser-Tab erledigen zu
lassen, aber so richtig sexy wäre das nicht.
Anlegen von Tabellen mit anschließendem Insert von Daten unter PHP
Moderator: thorben.braun
Das ist das Sichtbarkeitsproblem bei Transaktionen in der Firebird.
Nach einem CreateTable muss ja ein Commit gemacht werden, damit die Tabelle sichtbar wird.
Nun hast du ggf. über eine 2. Verbindung das Erstellen übernommen, so dass die Tabelle auf Grund der offenen Transaktion der 1. Verbindung noch verborgen bleibt.
Also Reihenfolge beachten:
- Start Transaction
- Create ....
- Commit Transaction
- Start Transaction
- Insert .....
- Commit Transaction
Nach Möglichkeit auf derselben Connection.
Nach einem CreateTable muss ja ein Commit gemacht werden, damit die Tabelle sichtbar wird.
Nun hast du ggf. über eine 2. Verbindung das Erstellen übernommen, so dass die Tabelle auf Grund der offenen Transaktion der 1. Verbindung noch verborgen bleibt.
Also Reihenfolge beachten:
- Start Transaction
- Create ....
- Commit Transaction
- Start Transaction
- Insert .....
- Commit Transaction
Nach Möglichkeit auf derselben Connection.