13

Estoy buscando una forma de automatizar la generación de scripts de cambio para nuestras bases de datos.Generación automática de scripts de cambio de base de datos

Actualmente utilizamos la edición de la base de datos Visual Studio 2008, que tiene la opción de Comparación de esquemas, pero no veo una manera de automatizar esas acciones.

Lo que me gustaría hacer es crear una base de datos antigua y una nueva durante mis compilaciones diarias y hacer que el esquema compare generar un script de cambio para las diferencias entre esos dos. (Las diferencias en el esquema y los procedimientos, las tablas de búsqueda se pueden descartar y volver a crear sin problemas)

¿Alguien sabe de una solución, o voy a escribir miles de secuencias de comandos para que esto funcione?

El uso de cualquiera de los productos pagados, además de las herramientas Microsoft no es una opción aquí ...

de actualización basado en la retroalimentación:

  • Tengo varias bases de datos de varios tamaños, pero todos los cambios que sucederá en una de forma controlada y consciente de los datos ya presentes.
  • Solo los cambios "sencillos" deben hacerse de forma automática, estoy pensando en agregar columnas y tablas (muy comunes). Las columnas nunca se pueden eliminar (por lo que la herramienta/script puede protestar si esto sucede)

Respuesta

7

Similar a lo que está haciendo @Anton Gogolev, estamos utilizando una herramienta que le permite escribir migraciones en archivos XML. La herramienta que utilizamos se llama Liquibase y es compatible con muchos sabores DBMS diferentes. No solo lo usamos internamente en nuestros esquemas de desarrollador, también lo usamos externamente durante la instalación de la actualización que ejecuta el cliente.

+0

Buena llamada, voy a mirar esto – thijs

1

Puede intentar invertir su enfoque un poco.

Estoy desarrollando una herramienta llamada Wizardby que le permite escribir migraciones de bases de datos en una DSL especial. Por lo tanto, en lugar de confiar en algoritmos de comparación de esquemas frágiles (por ejemplo, ninguno puede manejar los renglones de columna/tabla correctamente), escribe todas las modificaciones en el esquema de base de datos en un archivo mdl, que luego Wizardby compila en SQL específico de la plataforma . También se puede integrar en su proceso de construcción.

+0

Ya utilizamos Enterprise Architect para modelar nuestras bases de datos, desde allí generamos scripts de creación sql. Echaré un vistazo a lo que EA puede hacer aquí ... – thijs

1

La funcionalidad de SQL Compare también está disponible como bibliotecas y está documentada como tal. Utilicé esos dlls en una aplicación de consola, no tuve problemas.

+0

¿Puede ser más específico sobre qué ensamblajes/clases utilizó, tal vez incluso proporcionar alguna muestra? – thijs

1

¿Puede ser más específico? Por ejemplo, ¿qué tan grande es la base de datos? ¿Cuántos datos tiene? ¿Qué tan rápido debe ser la actualización?

Estoy seguro de que no hay una solución totalmente genérica y automática para este problema.

  • ¿Si cambias el nombre de la columna y haces solo y solo el esquema compara? La columna se eliminará y se creará vacía.

  • Si divide la columna FullName en Name, MidleName, SurName. ¿Cómo se debe comparar el esquema?

Claro que estas muestras pueden continuar y seguir.

+0

Puedo decir con seguridad que los cambios de nombre no sucederán. Lo mismo para dividir datos. Cualquier cambio en el esquema será "seguro" para los datos. Si cambiamos cosas que necesitarían reconstruir los datos, estaré feliz de escribir scripts manualmente para eso. Quiero que la automatización se encargue de las cosas "fáciles" (agregar tablas, columnas, actualizar y agregar índices) – thijs

3

Como thijs mencionado, el Database Edition Power Tools contiene el SqlSchemaCompareTask que se puede utilizar desde el código para generar una secuencia de comandos de cambio:

SqlSchemaCompareTask task = new SqlSchemaCompareTask() 
{ 
    SourceConnectionString = "Data Source=source-db; ...", 
    SourceDatabaseName = "source-database-name", 
    TargetConnectionString = "Data Source=target-db; ...", 
    TargetDatabaseName = "target-database-name", 
    OutputFileName = "changes.sql", 
    OutputPath = @"C:\path\to\output" 
}; 

task.Execute(); 

Alternativamente, se puede ejecutar utilizando un script de construcción a través de msbuild.exe:

<Import 
    Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v8.0\TeamData\ 
      Microsoft.VisualStudio.TeamSystem.Data.PowerTools.Tasks.targets"/> 
<Target Name ="SchemaCompare"> 
    <SqlSchemaCompareTask 
     SourceConnectionString="$(SourceConnectionString)" 
     SourceDatabaseName="$(TargetDatabase)" 
     TargetConnectionString="$(TargetConnectionString)" 
     TargetDatabaseName="$(TargetDatabase)" 
     OutputPath = "$(IntermediateOutputPath)" 
     OutputFileName = "$(TargetDatabase)SchemaCompare.sql" 
     IgnoreChecks ="true"/> 
</Target> 
+0

¿A dónde se dirigió esta funcionalidad en VS2010? – CodeGrue

1

Desde hace 10 años utilizo DbGhost para implementar la gestión de cambio de sql en la mayoría de las consultorías en las que he estado; es una sorpresa interminable ante la falta de administración de cambios SQL para competir con el código de la aplicación.

Innovartis' soporte es inigualable en la prestación de asistencia en la implementación de un enfoque de integración continua para el soporte de la base de datos, así como el proceso de liberación y las rutas de actualización. Recientemente lo he aplicado al proyecto Monorail/nHibernate en el que estoy trabajando que genera scripts de actualización de nuestro modelo de dominio POCO que especifica nuestra base de datos. Estos se crean y aplican utilizando nuestra estructura CruiseControl en cada check-in.

Más específicamente para su situación, puede señalar DbGhost a la versión de lanzamiento (v1.0) de su base de datos y secuencias de comandos de su fuente y datos estáticos. Esto se puede ingresar en el control de fuente. Estos son pasos opcionales pero un buen punto de partida.

DbGhost también se puede comparar (y/o crear) una base de datos generada desde el origen o una base de datos actual (por ejemplo v1.1) y proporcionar un informe de comparación, secuencia de comandos de actualización o actualizar la base de datos de destino.

Lo usamos para generar todos los scripts de actualización (avance y retroceso) para actualizar entre cada delta.

En 10 años cada vez que encuentro un problema con el producto, los tipos de ayuda siempre cortésmente señalan un error en mi proceso o uno de los muchos puntos de extensión en el proceso que necesito usar para pasar mi problema. Ciertamente maneja la caída de columnas, índices, datos, absolutamente todo. La configuración le permite realizar solo cambios simples automáticamente y puede fallar en advertencias o eliminar objetos (columnas/tablas), todos mantenibles en archivos de configuración xml (tenemos configuraciones más comprensivas en nuestra compilación de desarrollo y más estrictas para la compilación en vivo).

No me gustaría contemplar el desarrollo de Servidor Sql sin él y revolucionó mi desarrollo de SQL.

Si necesita más detalles sobre un proceso recomendado o más pasos prescriptivos, por favor hágamelo saber.

5

esperanza todavía puedo ayudar:

usted debería ser capaz de hacer esto con cualquier buena herramienta de comparación de base de datos que soporta la interfaz de línea de comandos. En ese caso, debería crear un script bat simple y agregarlo al planificador de tareas.

Sé que ApexSQL Diff es compatible con esta funcionalidad y estoy seguro de que SQL Compare de Red Gate tiene la misma opción en la versión pro.

Cuestiones relacionadas