ALTER DATABASEステートメントはマルチステートメントトランザクション内では許可されません


12

ここからAdventureWorksベースのインメモリサンプルをダウンロードし、付属のドキュメントに記載されているすべての手順を実行しました。ただし、SQL Server Management Studioでスクリプトを実行しようとすると、次のエラーメッセージが表示されます。

ALTER DATABASEステートメントはマルチステートメントトランザクション内では許可されません

エラーは9行目を指しています。

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

これは(多かれ少なかれ)Microsoftの公式ドキュメントであるため、私はそれが間違っていると思っていますが、それが何かを理解することはできません。

回答:


13

いいえ、あなたは何も悪いことをしていません。私は同じものを得た。サンプルを複数のスクリプトに分割し、1つの大きなスクリプトとしてではなく、独自のクエリウィンドウでスクリプトの各セクションを順番に実行することで解決しました。これらのサンプルは常に隔離されたVM(運用サーバーではない!)で実行されており、トランザクション処理は必要ないため、これは私のケースで機能しました。

今日、スクリプトをより詳しく見ると、明示的に定義されたトランザクション処理はありませんが、既にアクティブなトランザクションがあるクエリウィンドウにスクリプトを貼り付けるか、BEGIN TRANSACTION; / COMMIT TRANSACTION;ステートメントを自動的に追加する新しいクエリウィンドウを作成した可能性があります。

このブログ投稿で他の潜在的な落とし穴を指摘しました。


1
「おそらく、すでにアクティブなトランザクションがあるクエリウィンドウにスクリプトを貼り付けたのでしょう」それは問題だったようです。クエリ全体を新しいウィンドウで実行したときに機能したからです。
ペッターブロディン14年

8

私はあなたが何も悪いことをしていない@AaronBertrandに同意します。バグのあるMicrosoftスクリプトを見たのはこれが初めてではありません。現実的には、公開しているスクリプトと同じ数のスクリプトがあれば、どれも表示されないことに驚かされます。

特に問題はALTER DATABASE、トランザクションでまったく許可されないことです。BOLリファレンスは、トランザクションで許可されるTransact-SQLステートメントを参照してください。

実際、これも同じエラーで失敗するのと同じくらい簡単なスクリプトです。

BEGIN TRANSACTION
ALTER DATABASE AdventureWorks2012 SET READ_WRITE
COMMIT

アーロンが言ったように、トランザクション処理(または少なくともALTER DATABASEトランザクションからのステートメント)を削除すれば問題ありません。


-2

「Go」を使用してトランザクションを分離します。これで問題は解決します。(1つずつ実行するよりも簡単です。)分離レベルも変更できます(テストなし)

SET TRANSACTION ISOLATION LEVEL SERIALISABLE

Begin tran

---Statements goes here

commit tran

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

ALTER DATABASEトランザクション内で実行できない他の人が既に特定している場合、投稿する前にコードをテストすることができます。分離レベルをに設定しSERIALIZABLEても、これには影響しません。
マックスヴァーノン14

「GO」はSQLステートメントではありません。これは、前のステートメントをSQL Serverにバッチとして送信するためのSSMSへの指示です。勇気がある場合は、これを変更できます。[ツール]-> [オプション]-> [クエリ実行]-> [SQL Server]。1つのトランザクション内で多くのバッチを送信できます。
マイケルグリーン14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.