2009-06-25 7 views
28

Ich frage mich, ob es möglich ist, mehrere DDL-Anweisungen innerhalb einer Transaktion auszuführen. Ich bin speziell an SQL Server interessiert, obwohl auch Antworten mit anderen Datenbanken (Oracle, zumindest PostgreSQL) interessant sein könnten.Ist es möglich, mehrere DDL-Anweisungen innerhalb einer Transaktion (innerhalb von SQL Server) auszuführen?

Ich habe einige "CREATE TABLE" und "CREATE VIEW" für die erstellte Tabelle innerhalb einer Transaktion gemacht und es scheint einige Inkonsistenzen zu geben und ich frage mich, ob die DDLs innerhalb der Transaktion nicht getan werden sollten. ..

Ich könnte wahrscheinlich die DDL außerhalb der Transaktion bewegen, aber Ich möchte eine Referenz dafür erhalten.

  • MSDN-Seite Isolation Levels in the Database Engine sagt deutlich, dass gibt es Beschränkungen auf, was DDL-Operationen durchgeführt werden kann in einer expliziten Transaktion, die unter Snapshot-Isolation ausgeführt wird - aber ich bin nicht mit Snapshot-Isolation: Was habe ich bis jetzt dieses gefunden und das sollte als ein Fehler resultieren.
  • Dies könnte so interpretiert werden, dass DDL-Operationen in einer expliziten Transaktion unter verschiedenen Isolationsstufen ausgeführt werden können?
  • Oracle® Database Gateway for SQL Server User's Guide#DDL Statements besagt, dass nur eine DDL-Anweisung kann in einer gegebenen Transaktion ausgeführt wird - gilt dies auch für SQL Server verwendet, um gerade?
  • Für Oracle:

    Antwort

    1

    Könnte es sein, dass in MS SQL implizite Transaktionen ausgelöst werden, wenn DDL- und DML-Anweisungen ausgeführt werden. Wenn Sie diese Option deaktivieren, verwenden Sie SET IMPLICIT_TRANSACTIONS

    BEARBEITEN: eine andere Möglichkeit - Sie können CREATE VIEW nicht mit anderen Anweisungen im selben Batch kombinieren. CREATE TABLE ist in Ordnung. Sie trennen Chargen mit GO.

    EDIT2: Sie können mehrere DDL in einer Transaktion verwenden, solange sie mit GO getrennt sind, um verschiedene Chargen zu erstellen.

    +0

    Ich benutze JDBC Verbindung # setAutoCommit (falsch) und die DML-Anweisungen sind nicht mit impliziten Transaktionen abgeschlossen. Die Ergebnisse scheinen eher so zu sein, dass die Tabelle zum Erstellen der Ansicht mit nicht immer da wäre oder so. – Touko

    +0

    Für EDIT: Das könnte sein, aber ich hätte gerne einen Verweis auf SQL Server-Dokumentation oder etwas, ob es ist oder nicht erlaubt ist .. – Touko

    +0

    Ich habe dieses Buch verwendet, sehen Sie, wenn Sie online finden? Microsoft® SQL Server® 2008 T-SQL-Grundlagen Drucken ISBN-10: 0-7356-2601-4 Drucken ISBN-13: 978-0-7356-2601-0 – Stuart

    1

    Für den allgemeinen Fall und IIRC ist es nicht sicher anzunehmen, dass DDL-Anweisungen transaktional sind.

    Das heißt, es gibt sehr viel Spielraum, wie Schemaänderungen innerhalb einer Transaktion interagieren (vorausgesetzt, dass es überhaupt geschieht). Dies kann durch den Verkäufer oder sogar durch die bestimmte Installation (d. H. Bis zu der DBA), glaube ich. Verwenden Sie also zumindest kein DBMS, um anzunehmen, dass andere DDL-Anweisungen als "say" behandeln.

    Edit: MySql ist ein Beispiel für ein DBMS, das DDL-Transaktionen überhaupt nicht unterstützt.Wenn Sie über Datenbankreplikation/-spiegelung verfügen, müssen Sie außerdem sehr vorsichtig sein, dass der Replikationsdienst (die Replikation von Sybase ist die Norm, ob Sie es glauben oder nicht) die DDL-Anweisung tatsächlich repliziert.

    4

    Wenn Sie im laufenden Betrieb Tabellen, Ansichten usw. (außer Tabellenvariablen oder temporäre Tabellen) erstellen, müssen Sie Ihr Design wirklich überdenken. Dies sind keine Dinge, die normalerweise von der Benutzeroberfläche aus geschehen sollten. Selbst wenn Sie eine Anpassung zulassen müssen, sollten die DDL-Anweisungen nicht gleichzeitig mit der Ausführung transaktionaler Einfügungen/Aktualisierungen/Löschungen erfolgen. Es ist viel besser, diese Funktionen zu trennen.

    Dies ist auch etwas, das eine gesunde Dosis von Überlegung und Tests benötigt, was passiert, wenn zwei Benutzer versuchen, die Struktur der gleichen Tabelle zur gleichen Zeit zu ändern und dann eine Transaktion auszuführen, um Daten einzufügen. Es gibt wirklich gruselige Dinge, die passieren können, wenn Sie Benutzern erlauben, Anpassungen an Ihrer Datenbankstruktur vorzunehmen.

    Auch einige DDL-Anweisungen müssen immer die erste Anweisung eines Stapels sein. Achten Sie auch darauf, wenn Sie sie ausführen.

    +0

    Sie haben einen guten Punkt, leider mit diesem Projekt bin ich gezwungen, diese Legacy-db-Design .. Diese Chargen scheinen eine Einheit von SQL Server-Anweisungen .. Wahrscheinlich laufen alle meine Aussagen in separaten Batches mit JDBC bis Ich möchte es ausdrücklich ... zumindest denke ich .. – Touko

    +18

    Ich würde hinzufügen, dass ich DDL-Transaktionen sehr nützlich für eine andere Reihe von Umständen finden würde - nicht im laufenden Betrieb zu aktualisieren, aber sicherzustellen, dass Schema-Updates auf eine Produktionsdatenbank nie verlassen werden ein inkonsistenter Zustand. – Nathan

    +6

    Oder für das Migrieren von Schemas, wenn die DB vollständig von der Anwendung verwaltet wird und der Benutzer von einer früheren Version Ihrer App auf eine spätere aktualisiert hat. Solche Migrationen sollten niemals fehlschlagen, aber wenn dies der Fall ist, ist es besser, wenn die Datenbank im Status vor der Migration verbleibt. –

    13

    Ich weiß, die meisten Datenbanken haben Einschränkungen, aber Postgres nicht. Sie können in einer Transaktion Tabellenkalkulationen, Spaltenänderungen und Indexänderungen ausführen, und die Änderungen sind für andere Benutzer nicht sichtbar, wenn die COMMIT-Einheit erfolgreich ausgeführt wurde. So sollten Datenbanken sein! :-)

    Wie für SQL Server können Sie DDL innerhalb einer Transaktion ausführen, aber SQL Server does not version metadata, und so Änderungen wären für andere sichtbar, bevor die Transaktion festschreibt. Aber some DDL statements can be rolled back if you are in a transaction, aber für welche funktionieren und welche nicht müssen Sie einige Tests ausführen.

    +2

    Nur um mir selbst mit einigen Follow-up zu antworten, zwei Jahre später ... Obwohl SQL Server keine isolierten Transaktionen für DDL gibt, kann es mehrere DDL-Anweisungen Rollback, die Teil einer Transaktion gewesen sind.Mein Kollege hat gerade einen Test mit SQL Server 2008 R2 durchgeführt: "Ich habe versucht, eine Tabelle zu erstellen, eine Primärschlüsselspalte hinzuzufügen, in eine andere Tabelle einzufügen, eine Spalte zu einer anderen Tabelle hinzuzufügen, einzufügen und dann einen Fehler mit etwas ungültigem SQL zu erzwingen richtig zurückgerollt! ". Stellen Sie nur sicher, dass jede DDL-Anweisung in ihrem eigenen Stapel ist (mit GO-Trennzeichen). –

    +1

    Sollte die Take-away sein, "nicht DDL in SQL-Server ausführen, während die Datenbank verwendet wird"? Wie in, ist es in der Regel in Ordnung, eine Transaktion für DDL zu verwenden, solange nichts anderes die Tabelle liest (was bedeutet, dass Ihre Website während der Aktualisierung der Datenbank nicht verfügbar sein sollte, was sie wahrscheinlich ohnehin tun sollte). – jpmc26

    +0

    Ich kann bestätigen, dass Ingres (mindestens) Spaltenänderungen als Teil einer breiteren CRUD-Transaktion erlaubt. Wahrscheinlich nicht überraschend angesichts der Postgres/Ingres-Beziehung. – Sepster