ALTER DATABASE-Anweisung innerhalb einer Transaktion mit mehreren Anweisungen nicht zulässig

12

Ich habe das AdventureWorks-basierte In-Memory-Beispiel von hier heruntergeladen und alle im zugehörigen Dokument beschriebenen Schritte ausgeführt. Wenn ich jedoch versuche, das Skript in SQL Server Management Studio auszuführen, wird folgende Fehlermeldung angezeigt:

ALTER DATABASE-Anweisung innerhalb einer Transaktion mit mehreren Anweisungen nicht zulässig

Der Fehler zeigt auf Zeile 9:

IF NOT EXISTS (SELECT * FROM sys.data_spaces WHERE type='FX')
    ALTER DATABASE CURRENT ADD FILEGROUP [AdventureWorks2012_mod] 
    CONTAINS MEMORY_OPTIMIZED_DATA
GO

Da dies (mehr oder weniger) eine offizielle Microsoft-Dokumentation ist, gehe ich davon aus, dass ich etwas falsch mache, aber ich kann nicht herausfinden, was es ist.

Petter Brodin
quelle

Antworten:

13

Nein, du machst nichts falsch. Ich habe das Gleiche. Ich habe es gelöst, indem ich das Beispiel in mehrere Skripte aufgeteilt und jeden Abschnitt des Skripts nacheinander in einem eigenen Abfragefenster ausgeführt habe, anstatt als ein einziges großes Skript. Dies hat in meinem Fall funktioniert, da ich diese Beispiele immer in einer isolierten VM (nicht auf einem Produktionsserver!) Laufe und die Transaktionsbehandlung nicht erforderlich ist, da ich der einzige hier bin.

Wenn Sie das Skript heute noch einmal genauer betrachten, ist keine Transaktionsbehandlung explizit definiert, aber Sie haben das Skript möglicherweise in ein Abfragefenster eingefügt, in dem bereits eine Transaktion aktiv war, oder Sie haben ein neues Abfragefenster erstellt, in dem BEGIN TRANSACTION; / COMMIT TRANSACTION;Anweisungen automatisch hinzugefügt wurden .

Ich habe in diesem Blog-Beitrag auch auf einige andere potenzielle Fallstricke hingewiesen .

Aaron Bertrand
quelle
1
"Vielleicht haben Sie das Skript in ein Abfragefenster eingefügt, in dem bereits eine Transaktion aktiv war." Das scheint das Problem gewesen zu sein, denn als ich die gesamte Abfrage in einem neuen Fenster ausgeführt habe, hat es funktioniert.
Petter Brodin
8

Ich bin mit @AaronBertrand einverstanden, dass Sie nichts falsch machen. Dies wäre nicht das erste Mal, dass ich ein Microsoft-Skript mit einem Fehler darin sehe. Bei so vielen Skripten, wie sie veröffentlichen, wäre ich realistisch überrascht, keine zu sehen.

Insbesondere besteht das Problem darin, dass ALTER DATABASEeine Transaktion überhaupt nicht zulässig ist. Die BOL-Referenz finden Sie hier: In Transaktionen zulässige Transact-SQL-Anweisungen

Selbst ein so einfaches Skript schlägt mit demselben Fehler fehl.

BEGIN TRANSACTION
ALTER DATABASE AdventureWorks2012 SET READ_WRITE
COMMIT

Wie Aaron sagte, entfernen Sie die Transaktionsbehandlung (oder zumindest die ALTER DATABASEAnweisung aus der Transaktion) und Sie sollten in Ordnung sein.

Kenneth Fisher
quelle
-2

Verwenden Sie "Los", um die Transaktionen zu trennen. Das wird das Problem lösen. (Es ist einfach, als eins nach dem anderen auszuführen.) Kann auch die Isolationsstufe ändern (nicht getestet)

SET TRANSACTION ISOLATION LEVEL SERIALISABLE

Begin tran

---Statements goes here

commit tran

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
Eranga Priyakara
quelle
Möglicherweise möchten Sie Ihren Code vor dem Posten testen, wenn andere Personen bereits festgestellt haben, dass ALTER DATABASEdies innerhalb einer Transaktion nicht möglich ist. Das Einstellen der Isolationsstufe auf SERIALIZABLEhat darauf keinen Einfluss.
Max Vernon
"GO" ist keine SQL-Anweisung. Es ist eine Anweisung an SSMS, die vorhergehenden Anweisungen als Batch an SQL Server zu senden. Sie können dies ändern, wenn Sie sich mutig fühlen: Tools -> Options -> Query Execution -> SQL Server. Innerhalb einer Transaktion können viele Chargen eingereicht werden.
Michael Green