web-dev-qa-db-ja.com

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

here から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
Petter Brodin

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

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

このブログの投稿 で、他にもいくつかの問題点を指摘しました。

13
Aaron Bertrand

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

具体的には、問題はALTER DATABASEはトランザクションでは許可されていません。 BOLリファレンスはこちらからご覧いただけます。 トランザクションで許可されているTransact-SQLステートメント

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

BEGIN TRANSACTION
ALTER DATABASE AdventureWorks2012 SET READ_WRITE
COMMIT

アーロンが言ったように、トランザクション処理(または少なくともALTER DATABASEトランザクションからのステートメント)、あなたは大丈夫です。

9
Kenneth Fisher