Оператор ALTER DATABASE не допускається в рамках транзакції з кількома заявами


13

Звідси я завантажив зразок In-memory на основі 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

Ні, ти нічого поганого не робиш. Я отримав те саме. Я вирішив це, розбивши зразок на кілька сценаріїв і запустивши кожен розділ сценарію послідовно, у своєму власному вікні запитів, а не як один великий сценарій. У моєму випадку це спрацювало, тому що я завжди запускаю ці зразки в ізольованому VM (не на виробничому сервері!), А обробка транзакцій непотрібна, оскільки я єдиний тут.

Подивівшись на сценарій ще раз більш уважно, обробка транзакцій чітко не визначена, але, можливо, ви вставили сценарій у вікно запитів, у якому вже була активна транзакція, або створили нове вікно запиту, яке автоматично додало BEGIN TRANSACTION; / COMMIT TRANSACTION;заяви.

У цій публікації блогу я також зазначив пару інших потенційних проблем .


1
"можливо, ви вставили скрипт у вікно запиту, в якому вже була активна транзакція". Здається, це була проблема, тому що коли я запустив весь запит у новому вікні, він спрацював.
Петтер Бродін

9

Я згоден з @AaronBertrand, що ти не робиш нічого поганого. Це був би не перший раз, коли я бачив сценарій Microsoft із помилкою в ньому. Реально з такою кількістю сценаріїв, як їх опубліковано, я був би здивований, що не побачив жодного.

Зокрема, проблема полягає в тому, що ALTER DATABASEвзагалі не дозволено проводити транзакцію. Посилання на BOL ви можете прочитати тут: Transact-SQL Заяви, дозволені в транзакціях

Насправді навіть такий простий сценарій, як цей не вдається з тією ж помилкою.

BEGIN TRANSACTION
ALTER DATABASE AdventureWorks2012 SET READ_WRITE
COMMIT

Як сказав Аарон, видаліть обробку транзакції (або принаймні ALTER DATABASEвиписку з транзакції), і вам слід буде добре.


-2

Використовуйте "Перейти", щоб розділити транзакції. Це вирішить питання. (Це легше, ніж запускати по черзі.) Також може змінити рівень ізоляції (не перевірено)

SET TRANSACTION ISOLATION LEVEL SERIALISABLE

Begin tran

---Statements goes here

commit tran

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

Ви можете перевірити свій код перед публікацією, коли інші вже визначили, що ALTER DATABASEнеможливо виконати в рамках транзакції. Встановлення рівня ізоляції на SERIALIZABLEце не впливає.
Макс Вернон

"GO" не є оператором SQL. Це інструкція SSMS подавати попередній оператор (и) на SQL Server як пакетний. Ви можете змінити це, якщо відчуваєте себе сміливим: Інструменти -> Параметри -> Виконання запитів -> SQL Server. Багато партій можна подати в рамках однієї транзакції.
Майкл Грін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.