Istruzione ALTER DATABASE non consentita all'interno della transazione multiistruzione


13

Ho scaricato l'AdventureWorks basate campione in memoria da qui , e seguito tutte le fasi descritte nel documento di accompagnamento. Tuttavia, quando provo a eseguire lo script in SQL Server Management Studio, visualizzo il messaggio di errore:

Istruzione ALTER DATABASE non consentita all'interno della transazione multiistruzione

L'errore punta alla riga 9, che è:

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

Dato che questa è (più o meno) documentazione ufficiale di Microsoft, presumo sia qualcosa che sto sbagliando, ma non riesco a capire di cosa si tratti.

Risposte:


13

No, non stai facendo niente di male. Ho avuto la stessa cosa. L'ho risolto suddividendo il campione in più script ed eseguendo ogni sezione dello script in sequenza, nella sua finestra di query, anziché come un unico grande script. Nel mio caso ha funzionato perché eseguo sempre questi esempi in una VM isolata (non su un server di produzione!) E la gestione delle transazioni non è necessaria poiché sono l'unico qui.

Guardando di nuovo lo script oggi più da vicino, non esiste una gestione delle transazioni definita in modo esplicito, ma forse hai incollato lo script in una finestra di query che aveva già una transazione attiva o hai creato una nuova finestra di query che ha aggiunto automaticamente le BEGIN TRANSACTION; / COMMIT TRANSACTION;istruzioni.

Ho anche sottolineato un paio di altri potenziali problemi in questo post del blog .


1
"forse hai incollato lo script in una finestra di query che aveva già una transazione attiva" Questo sembra essere stato il problema, perché quando ho eseguito l'intera query in una nuova finestra, ha funzionato.
Petter Brodin,

9

Sono d'accordo con @AaronBertrand che non stai facendo nulla di male. Non sarebbe la prima volta che vedo uno script Microsoft con un bug. Realisticamente con tutti gli script che pubblicano, sarei sorpreso di non vederne nessuno.

In particolare, il problema è che ALTER DATABASEnon è consentito affatto in una transazione. È possibile visualizzare il riferimento BOL qui: Istruzioni Transact-SQL consentite nelle transazioni

In realtà anche uno script semplice come questo fallisce con lo stesso errore.

BEGIN TRANSACTION
ALTER DATABASE AdventureWorks2012 SET READ_WRITE
COMMIT

Come ha detto Aaron, rimuovere la gestione della transazione (o almeno la ALTER DATABASEdichiarazione dalla transazione) e dovresti stare bene.


-2

Utilizzare "Vai" per separare le transazioni. Questo risolverà il problema. (È facile che eseguirlo uno per uno.) Inoltre può cambiare il livello di isolamento (Non testato)

SET TRANSACTION ISOLATION LEVEL SERIALISABLE

Begin tran

---Statements goes here

commit tran

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

Potresti voler testare il tuo codice prima di pubblicare quando altri hanno già identificato che ALTER DATABASEnon possono essere eseguiti all'interno di una transazione. L'impostazione del livello di isolamento su SERIALIZABLEnon ha alcun effetto su questo.
Max Vernon,

"GO" non è un'istruzione SQL. È un'istruzione a SSMS per inviare le istruzioni precedenti a SQL Server come batch. Puoi cambiarlo se ti senti coraggioso: Strumenti -> Opzioni -> Esecuzione query -> SQL Server. Molti lotti possono essere inviati all'interno di una singola transazione.
Michael Green,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.