ALTER DATABASE pernyataan tidak diizinkan dalam transaksi multi-pernyataan

13

Saya telah mengunduh sampel Dalam-memori berbasis AdventureWorks dari sini , dan mengikuti semua langkah yang dijelaskan dalam dokumen yang menyertai. Namun, ketika saya mencoba menjalankan skrip di SQL Server Management Studio, saya mendapatkan pesan kesalahan:

ALTER DATABASE pernyataan tidak diizinkan dalam transaksi multi-pernyataan

Kesalahan menunjuk ke baris 9, yaitu:

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

Karena ini (kurang lebih) dokumentasi resmi Microsoft, saya berasumsi itu adalah sesuatu yang saya lakukan salah, tetapi saya tidak tahu apa itu.

Petter Brodin
sumber

Jawaban:

13

Tidak, Anda tidak melakukan kesalahan apa pun. Saya mendapat hal yang sama. Saya memecahkannya dengan memecah sampel menjadi beberapa skrip dan menjalankan setiap bagian skrip secara berurutan, di jendela kueri sendiri, bukan sebagai satu skrip besar. Ini berfungsi dalam kasus saya karena saya selalu menjalankan sampel ini dalam VM yang terisolasi (bukan pada server produksi!) Dan penanganan transaksi tidak diperlukan karena saya satu-satunya di sini.

Melihat skrip lagi hari ini lebih dekat, tidak ada penanganan transaksi yang didefinisikan secara eksplisit, tetapi mungkin Anda menempelkan skrip ke jendela permintaan yang sudah memiliki transaksi aktif, atau membuat jendela permintaan baru yang secara otomatis menambahkan BEGIN TRANSACTION; / COMMIT TRANSACTION;pernyataan.

Saya juga menunjukkan beberapa Gotcha potensial lainnya di posting blog ini .

Aaron Bertrand
sumber
1
"Mungkin Anda menyisipkan skrip ke jendela permintaan yang sudah memiliki transaksi aktif" Itu tampaknya menjadi masalah, karena ketika saya menjalankan seluruh permintaan di jendela baru, itu berhasil.
Petter Brodin
9

Saya setuju dengan @AaronBertrand Anda tidak melakukan kesalahan. Ini bukan pertama kalinya saya melihat skrip Microsoft dengan bug di dalamnya. Secara realistis dengan sebanyak mungkin skrip yang mereka terbitkan, saya akan terkejut tidak melihatnya.

Khususnya masalahnya adalah yang ALTER DATABASEtidak diperbolehkan dalam transaksi sama sekali. Anda dapat melihat referensi BOL di sini: Pernyataan Transact-SQL Diizinkan dalam Transaksi

Bahkan skrip sesederhana ini gagal dengan kesalahan yang sama.

BEGIN TRANSACTION
ALTER DATABASE AdventureWorks2012 SET READ_WRITE
COMMIT

Seperti kata Aaron, hapus penanganan transaksi (atau setidaknya ALTER DATABASEpernyataan dari transaksi) dan Anda harus baik-baik saja.

Kenneth Fisher
sumber
-2

Gunakan "Pergi" untuk memisahkan transaksi. Itu akan menyelesaikan masalah. (Lebih mudah dijalankan satu per satu.) Juga dapat mengubah level Isolasi (Tidak diuji)

SET TRANSACTION ISOLATION LEVEL SERIALISABLE

Begin tran

---Statements goes here

commit tran

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
Eranga Priyakara
sumber
Anda mungkin ingin menguji kode Anda sebelum memposting ketika orang lain telah mengidentifikasi bahwa ALTER DATABASEtidak dapat dilakukan dalam suatu transaksi. Mengatur level isolasi SERIALIZABLEtidak berpengaruh pada hal ini.
Max Vernon
"GO" bukan pernyataan SQL. Ini adalah instruksi untuk SSMS untuk mengirimkan pernyataan sebelumnya ke SQL Server sebagai batch. Anda dapat mengubah ini jika Anda merasa berani: Alat -> Opsi -> Eksekusi Kueri -> SQL Server. Banyak batch dapat dikirimkan dalam satu transaksi.
Michael Green