Instrução ALTER DATABASE não permitida em transações com várias instruções

12

Fiz o download do exemplo In-memory baseado em AdventureWorks aqui e segui todas as etapas descritas no documento que o acompanha. No entanto, quando tento executar o script no SQL Server Management Studio, recebo a mensagem de erro:

Instrução ALTER DATABASE não permitida em transações com várias instruções

O erro aponta para a linha 9, que é:

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

Como essa é (mais ou menos) a documentação oficial da Microsoft, estou assumindo que é algo que estou fazendo de errado, mas não consigo descobrir o que é.

Petter Brodin
fonte

Respostas:

13

Não, você não está fazendo nada de errado. Eu tenho a mesma coisa. Eu o resolvi dividindo a amostra em vários scripts e executando cada seção do script sequencialmente, em sua própria janela de consulta, em vez de um script grande. Isso funcionou no meu caso, porque eu estou sempre executando essas amostras em uma VM isolada (não em um servidor de produção!) E o manuseio de transações é desnecessário, pois sou o único aqui.

Olhando o script novamente hoje mais de perto, não há manipulação de transação definida explicitamente, mas talvez você tenha colado o script em uma janela de consulta que já possuía uma transação ativa ou criado uma nova janela de consulta que adicionasse BEGIN TRANSACTION; / COMMIT TRANSACTION;instruções automaticamente .

Também apontei algumas outras dicas em potencial neste post do blog .

Aaron Bertrand
fonte
1
"talvez você colou o script em uma janela de consulta que já tinha uma transação ativa" Esse parece ter sido o problema, porque quando eu executei toda a consulta em uma nova janela, ela funcionou.
Petter Brodin
8

Concordo com @AaronBertrand que você não está fazendo nada de errado. Esta não seria a primeira vez que eu vi um script da Microsoft com um bug. Realisticamente, com o maior número de scripts publicados, eu ficaria surpreso em não ver nenhum.

Especificamente, o problema é que isso ALTER DATABASEnão é permitido em nenhuma transação. Você pode ver a referência BOL aqui: Instruções Transact-SQL permitidas em transações

De fato, mesmo um script tão simples quanto esse falha com o mesmo erro.

BEGIN TRANSACTION
ALTER DATABASE AdventureWorks2012 SET READ_WRITE
COMMIT

Como Aaron disse, remova o manuseio da transação (ou pelo menos o ALTER DATABASEextrato da transação) e você ficará bem.

Kenneth Fisher
fonte
-2

Use "Ir" para separar as transações. Isso resolverá o problema. (É fácil do que executar um por um.) Também pode alterar o nível de isolamento (não testado)

SET TRANSACTION ISOLATION LEVEL SERIALISABLE

Begin tran

---Statements goes here

commit tran

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
Eranga Priyakara
fonte
Você pode testar seu código antes de postar quando outras pessoas já identificaram que ALTER DATABASEnão podem ser executadas em uma transação. Definir o nível de isolamento para SERIALIZABLEnão tem efeito nisso.
Max Vernon
"GO" não é uma instrução SQL. É uma instrução para o SSMS enviar as instruções anteriores ao SQL Server como um lote. Você pode alterar isso se estiver corajoso: Ferramentas -> Opções -> Execução de consultas -> SQL Server. Muitos lotes podem ser enviados em uma única transação.
Michael Green