Estoy tratando de definir una forma de trabajar con una base de datos de prueba (en SQL Server) para nuestras pruebas de integración.
Mi idea era seguir estos pasos en el lanzamiento del ensamblaje de prueba de integración:
- crear una base de datos totalmente vacía
- ejecute el script "crear objetos de base de datos" para crear todos los objetos de base de datos relevantes (tabla, vistas, secuencias, etc.)
- rellene los "datos base" (valores de búsqueda, etc.)
- tomar una instantánea de la base de datos llamada
(db)_Basis
como "línea base" para futuras pruebas de integración
Ahora, antes de cada clase de prueba (que contiene pruebas 1-n), estaba planeando simplemente hacer una "restauración desde la instantánea" para volver al estado bien definido, más o menos "vacío" de la base de datos. Funciona como un encanto hasta ahora.
Sin embargo, hay un conjunto de pruebas de integración que deben operar en una base de datos de prueba grande, por lo que esperaba hacer esto antes de cada uno de esos dispositivos de prueba (clases con n pruebas individuales)
- restaurar la base de datos desde la
(db)_Basis
instantánea - inserte esas 50,000 filas de datos en la base de datos
- crear otra instantánea
(db)_With_Testdata
instantánea
y luego, para cada prueba, restablezca la base de datos a la (db)_With_Testdata
versión de instantánea bien definida , ejecute las pruebas, verifique el resultado, etc.
El problema es que parece que no puedo tener dos instantáneas db al mismo tiempo; una vez que lo hago, no puedo restaurar mi base de datos en ninguno de ellos ... Continúo recibiendo este error:
Msg 3137, Nivel 16, Estado 4, Línea 9 La
base de datos no se puede revertir. El nombre principal o el nombre de la instantánea no se especifica correctamente, el resto de las instantáneas no se han eliminado o faltan archivos.El mensaje 3013, Nivel 16, Estado 1, Línea 9
RESTAURAR BASE DE DATOS está finalizando de manera anormal.
¿Es realmente así como funcionan las instantáneas de la base de datos de SQL Server? Parece terriblemente restrictivo ... Lo entendería si no pudiera volver directamente a la instantánea original "(db) _Basis" tal vez, pero solo porque ahora tengo dos instantáneas, ni siquiera puedo volver a la más reciente ?!?!?
fuente
Respuestas:
Desafortunadamente, es por diseño.
Tomado de la página BOL " Revertir una base de datos a una instantánea de base de datos ":
Como alternativa, puede soltar la primera instantánea
(db)_Basis
. Puedo entender que esto parece muy limitante, pero míralo de esta manera: las instantáneas son archivos dispersos basados en los archivos de datos originales, por lo que volver a una instantánea específica invalidaría todas las instantáneas de todos modos (la operación de reversión cambiaría los archivos de datos básicos) . La limitación puede ser molesta, pero no parece irrazonable.fuente
Otra perspectiva será hacer copias de seguridad y restaurar , ya que solo está creando una base de datos y un esquema vacíos con algunos valores de búsqueda.
Además, simplemente insertando 50K filas, la base de datos no será tan grande. Si usa compresión, el tamaño de la copia de seguridad también será menor.
Puede tener trabajos de Agente TSQL o solo secuencias de comandos (puede crear un procedimiento almacenado y simplemente llamarlo después de sus pruebas en función del resultado que obtenga).
(db)_Basis
(db)_With_Testdata
haga que se ejecuten sus scripts de integración y, según el resultado final, puede ejecutar cualquiera de los trabajos anteriores para volver al punto que desee.
Creo que el método de copia de seguridad / restauración es muy elegante en su escenario ya que está llegando a la limitación de la instantánea de la base de datos . Además, Paul Randal escribió en su blog sobre un error desagradable en todas las versiones hasta SQL Server 2012 inclusive (no estoy seguro de si se corrigió en una CU posterior)
fuente