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
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é.