J'essaie de définir une façon de travailler avec une base de données de test (dans SQL Server) pour nos tests d'intégration.
Mon idée était de faire ces étapes lors du lancement de l'assemblage de test d'intégration:
- créer une base de données totalement vide
- exécuter le script "créer des objets de base de données" pour créer tous les objets de base de données pertinents (table, vues, séquences, etc.)
- remplir les "données de base" (valeurs de recherche, etc.)
- prendre un instantané de la base de données appelé
(db)_Basis
"ligne de base" pour les futurs tests d'intégration
Maintenant, avant chaque classe de test (contenant des tests 1-n), je prévoyais simplement de faire une "restauration à partir d'un instantané" pour revenir à l'état bien défini, plus ou moins "vide" de la base de données. Fonctionne comme un charme jusqu'à présent.
Cependant, il existe un ensemble de tests d'intégration qui doivent fonctionner sur une grande base de données de tests - j'espérais donc le faire avant chacun de ces tests (classes avec n tests individuels)
- restaurer la base de données à partir de l'
(db)_Basis
instantané - insérer ces 50'000 + lignes de données dans la base de données
- créer un autre instantané
(db)_With_Testdata
instantané
puis pour chaque test, réinitialisez la base de données à la (db)_With_Testdata
version d'instantané bien définie , exécutez les tests, vérifiez le résultat, etc.
Le problème est: je n'arrive pas à avoir deux instantanés de base de données en même temps - une fois que je le fais, je ne peux pas restaurer ma base de données sur l'un d'eux .... Je reçois toujours cette erreur:
Msg 3137, niveau 16, état 4, ligne 9, la
base de données ne peut pas être rétablie. Le nom principal ou le nom de l'instantané n'est pas spécifié correctement, tous les autres instantanés n'ont pas été supprimés ou il manque des fichiers.Msg 3013, niveau 16, état 1, ligne 9
RESTORE DATABASE se termine anormalement.
Est-ce vraiment ainsi que fonctionnent les instantanés de base de données SQL Server? Semble terriblement restrictif ... Je comprendrais si je ne pouvais pas revenir directement à l'instantané "(db) _Basis" d'origine - mais juste parce que j'ai maintenant deux instantanés, je ne peux même pas revenir au plus récent ?!?!?
la source
Réponses:
Malheureusement, c'est par conception.
Tiré de la page BOL " Rétablir une base de données en un instantané de base de données ":
Comme alternative, vous pouvez supprimer le premier instantané
(db)_Basis
. Je peux comprendre que cela semble très limitant, mais regardez-le de cette façon: les instantanés sont des fichiers clairsemés basés sur les fichiers de données d'origine, donc le retour à un instantané spécifique invaliderait de toute façon tous les instantanés (les fichiers de données de base seraient modifiés par l'opération de restauration) . La limitation peut être gênante, mais ne semble pas déraisonnable.la source
Une autre perspective sera de prendre des sauvegardes et de les restaurer - puisque vous créez simplement une base de données et un schéma vides avec quelques valeurs de recherche.
De plus, en insérant simplement 50K lignes, la base de données ne sera pas si grande. Si vous utilisez la compression, la taille de la sauvegarde sera également inférieure.
Vous pouvez avoir un travail TSQL Agent ou simplement des scripts (vous pouvez peut-être créer une procédure stockée et l'appeler simplement après vos tests en fonction de la sortie que vous obtenez).
(db)_Basis
(db)_With_Testdata
exécutez vos scripts d'intégration et, en fonction de la sortie finale, vous pouvez exécuter l'un des travaux ci-dessus pour revenir au point que vous souhaitez.
Je pense que la méthode de sauvegarde / restauration est beaucoup plus élégante dans votre scénario puisque vous atteignez la limitation des instantanés de base de données . En outre, Paul Randal a blogué à propos d'un bogue désagréable dans toutes les versions jusqu'à et y compris SQL Server 2012 (je ne sais pas s'il est corrigé dans une CU ultérieure)
la source