web-dev-qa-db-fra.com

Instruction ALTER DATABASE non autorisée dans une transaction à instructions multiples

J'ai téléchargé l'exemple en mémoire basé sur AdventureWorks depuis ici , et j'ai suivi toutes les étapes décrites dans le document d'accompagnement. Cependant, lorsque j'essaie d'exécuter le script dans SQL Server Management Studio, j'obtiens le message d'erreur:

Instruction ALTER DATABASE non autorisée dans une transaction à instructions multiples

L'erreur pointe vers la ligne 9, qui est:

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

Comme il s'agit (plus ou moins) de documentation officielle de Microsoft, je suppose que c'est quelque chose que je fais mal, mais je ne peux pas comprendre ce que c'est.

13
Petter Brodin

Non, tu ne fais rien de mal. J'ai eu la même chose. Je l'ai résolu en divisant l'échantillon en plusieurs scripts et en exécutant chaque section du script séquentiellement, dans sa propre fenêtre de requête, au lieu d'un seul gros script. Cela a fonctionné dans mon cas car j'exécute toujours ces exemples dans un VM (pas sur un serveur de production!) Isolé et la gestion des transactions est inutile car je suis le seul ici.

En examinant à nouveau le script aujourd'hui de plus près, aucune gestion des transactions n'est définie explicitement, mais vous avez peut-être collé le script dans une fenêtre de requête qui avait déjà une transaction active ou créé une nouvelle fenêtre de requête qui a automatiquement ajouté BEGIN TRANSACTION; / COMMIT TRANSACTION; déclarations.

J'ai également souligné quelques autres problèmes potentiels dans ce billet de blog .

13
Aaron Bertrand

Je suis d'accord avec @AaronBertrand que vous ne faites rien de mal. Ce ne serait pas la première fois que je verrais un script Microsoft contenant un bogue. De façon réaliste avec autant de scripts qu'ils publient, je serais surpris de n'en voir aucun.

Plus précisément, le problème est que ALTER DATABASE n'est pas autorisé du tout dans une transaction. Vous pouvez voir la référence BOL ici: instructions Transact-SQL autorisées dans les transactions

En fait, même un script aussi simple que celui-ci échoue avec la même erreur.

BEGIN TRANSACTION
ALTER DATABASE AdventureWorks2012 SET READ_WRITE
COMMIT

Comme l'a dit Aaron, supprimez la gestion des transactions (ou au moins le ALTER DATABASE déclaration de la transaction) et ça devrait aller.

9
Kenneth Fisher