Ist es möglich, CREATE TABLE- und ALTER TABLE-Anweisungen in wichtigen SQL-Datenbanken rückgängig zu machen?
Arbeite ich an einem Programm, dass Probleme, die DDL. Ich würde gerne wissen, ob CREATE TABLE
und ähnliche DDL gerollt werden können zurück in
- Postgres
- MySQL
- SQLite
- et al
Beschreiben, wie die einzelnen Datenbank-Transaktionen mit DDL.
Kommentar zu dem Problem
community-wiki?
InformationsquelleAutor der Frage joeforker | 2011-01-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
http://wiki.postgresql.org/wiki/Transactional_DDL_in_PostgreSQL:_A_Competitive_Analysis bietet einen überblick über das Problem von PostgreSQL-Perspektive.
Ist DDL-Transaktions-nach diesem Dokument?
SQLite scheint auch Transaktions-DDL-als auch. Ich war in der Lage zu
ROLLBACK
eineCREATE TABLE
Anweisung in SQLite. SeineCREATE TABLE
Dokumentation erwähnt nicht irgendwelche speziellen Transaktions - 'fallen'.InformationsquelleAutor der Antwort joeforker
PostgreSQL hat Transaktions-DDL-Code für die meisten Datenbankobjekte (sicherlich Tabellen, Indizes etc, aber nicht Datenbanken, Benutzer). Jedoch praktisch alle DDL erhalten eine
ACCESS EXCLUSIVE
lock auf dem Ziel-Objekt, so dass es völlig unzugänglich, bis der DDL-Transaktion abgeschlossen ist. Auch sind nicht alle Situationen sind Recht behandelt - zum Beispiel, wenn Sie versuchen, wählen Sie aus der Tabellefoo
während eine andere Transaktion ablegen und erstellen von Ersatz Tabellefoo
, dann die blockierte Transaktion wird schließlich eine Fehlermeldung erhalten, anstatt die Suche nach einem neuenfoo
Tabelle. (Edit: dies wurde behoben, die vor oder in PostgreSQL 9.3)CREATE INDEX ... CONCURRENTLY
ist außergewöhnlich, es werden drei Transaktionen zum hinzufügen eines index zu einer Tabelle, während so dass gleichzeitige updates, es kann also nicht selbst durchgeführt werden, in einer Transaktion.Auch der Wartung der Datenbank-Befehl
VACUUM
kann nicht in einer Transaktion verwendet werden.InformationsquelleAutor der Antwort araqnid
Es ist zwar nicht streng genommen ein "rollback", in Oracle die FLASHBACK-Befehl kann verwendet werden, um zu lösen diese Arten von änderungen, wenn die Datenbank konfiguriert wurde, um es zu unterstützen.
InformationsquelleAutor der Antwort Dave Costa
Kann nicht mit MySQL scheint es, sehr dumm..
"Der CREATE TABLE-Anweisung in InnoDB verarbeitet wird, als eine einzelne Transaktion. Dies bedeutet, dass ein ROLLBACK vom Benutzer nicht rückgängig CREATE TABLE-Anweisungen, die der Benutzer während der Transaktion."
https://dev.mysql.com/doc/refman/5.7/en/implicit-commit.html
Habe versucht ein paar verschiedene Möglichkeiten, und es wird nicht einfach " roll back..
Umgehen, ist einfach ein Fehler-flag und die "drop table tblname", wenn eine der Abfragen fehlgeschlagen ist..
InformationsquelleAutor der Antwort Robert Sinclair