web-dev-qa-db-fra.com

Pourquoi ma base de données est-elle bloquée dans l'état Restauration?

J'ai quelques tests unitaires qui manipulent des données dans une base de données. Afin de garantir que l'état de la base de données est toujours le même pendant tous les tests, nous essayons de restaurer un database snapshot au début de ces tests.

Le code de restauration ressemble à ceci:

USE Master
ALTER DATABASE {0} SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
RESTORE DATABASE {0} FROM DATABASE_SNAPSHOT = '{1}' WITH RECOVERY
ALTER DATABASE {0} SET MULTI_USER

Après cela, les tests se connectent à la base de données et font tout ce qu'ils doivent faire.

Le problème est que, pendant le débogage des tests, si finalement je dois appuyer sur le bouton stop pour annuler les tests, la base de données est laissée à l'état Restoring pour toujours. C'est étrange car cela ne se produit que lorsque j'arrête la session de débogage. Si j'ai 20 tests et que tous restaurent l'instantané avant le test, je n'aurai aucune erreur lors de ces exécutions de test.

Avez-vous des suggestions sur ce qui pourrait être à l'origine de cela?

MODIFIER

En complément de la réponse de @ usr, pour récupérer la base de données de l'état incohérent au début des tests, il est nécessaire d'ajouter l'option REPLACE à l'instruction restore.

Cela fonctionnera si c'est comme ça:

USE Master
ALTER DATABASE {0} SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
RESTORE DATABASE {0} FROM DATABASE_SNAPSHOT = '{1}' WITH RECOVERY, REPLACE
ALTER DATABASE {0} SET MULTI_USER
6
andrerpena

Si vous abandonnez un RESTORE à mi-chemin, la base de données est dans un état inutilisable. Cela a du sens: certaines pages sont anciennes, d'autres sont nouvelles.

L'arrêt du débogueur tue le processus client, provoquant la suppression de la connexion et de toutes les sessions et requêtes associées par SQL Server.

Pour le faire fonctionner, redémarrez la dernière étape de restauration qui a été interrompue. Dans votre cas, restaurez à partir de l'instantané.

6
usr