Herramienta para generar scripts de actualización de bases de datos SQL

Estoy buscando una herramienta o un proyecto de código abierto que pueda generar scripts de actualización de bases de datos de la siguiente manera:

  • Aceptar una cadena de conexión de base de datos como parámetro de configuración
  • Conéctese a la base de datos especificada y obtenga una lista de todos los objetos de la base de datos: tablas, procedimientos almacenados, restricciones, etc. (idealmente, me gustaría personalizar los tipos de objetos a buscar, es decir, solo tablas o solo procedimientos almacenados)
  • Genere un script SQL que contenga código que verifique si cada uno de los objetos descubiertos existe y cree uno si no existe.

Actualmente necesito hacer esto para una base de datos de SQL Server.

El propósito de esta herramienta sería sincronizar periódicamente la estructura de la base de datos entre múltiples instancias.

Es preferible Windows. Cuanto más barato mejor (obviamente), idealmente me gustaría encontrar un proyecto de código abierto que haga algo similar. Pero no tengo ningún límite de precio fijo.

Respuestas (3)

No, no existe ninguna herramienta para hacer todo lo que pides, ni con un 100% de éxito ni con una cobertura completa.

Las piezas que faltan, es decir, los objetos agregados más tarde en una de las instancias, son bastante difíciles. Pero alteraciones como nombres cambiados, tipos de datos alterados, columnas o tablas eliminadas, etc., hacen imposible la comparación periódica con la sincronización.

Herramientas de diferencias de base de datos

La comparación de dos estructuras de bases de datos a veces se denomina comparaciones "diff" o "diffing" como en las características de detección de diferencias de los editores de texto y procesadores de texto que comparan documentos.

Estas herramientas son específicas para productos de bases de datos particulares, ya que cualquier implementación de un producto de base de datos real supera con creces el alcance del estándar SQL. Y, por lo que he visto, ninguna de estas herramientas está completa al 100% debido a las complejidades en la implementación de un sistema de base de datos.

Estas herramientas pueden generar un informe de la diferencia. Y algunas herramientas pueden generar SQL para crear objetos definidos en uno pero que no tienen en el otro. Pero le advierto que no considere tales informes o SQL como perfectos o completos.

Herramientas de migración de bases de datos

La gestión de los cambios realizados en la estructura de su base de datos a lo largo del tiempo se denomina herramienta de migración de base de datos . El propósito es hacer evolucionar su esquema de base de datos de manera fácil y confiable en todas sus instancias.

Dos buenos en el mundo de Java son:

La forma más fácil de usar una herramienta de este tipo es al principio de la base de datos. Luego registra cada modificación del esquema de la base de datos como scripts SQL. Primero se crea una tabla adicional para registrar un número de versión. Los scripts se pueden ejecutar en cualquier instancia de base de datos para actualizar su esquema.

Y también hay formas de usar una herramienta de este tipo en bases de datos existentes.

Eso no es exactamente lo que estoy buscando. No quiero escribir manualmente scripts de actualización cada vez que cambio el esquema (por ejemplo ALTER TABLE xxx ADD COLUMN yyy). Quiero poder generar automáticamente un único script SQL que actualice cualquier base de datos a la estructura de mi base de datos local (pseudocódigo:) IF COLUMN xxx.yyy NOT EXISTS THEN ALTER TABLE xxx ADD COLUMN yyy. Entiendo que dicha estrategia de actualización no funcionará en el 100% de los casos, pero será suficiente para mis necesidades.
@holdenmcgrohen Mira mis ediciones.

Recomiendo encarecidamente la comparación de SQL de Redgate:

http://www.red-gate.com/products/sql-development/sql-compare/

Parece tener las características que necesita. Otra de sus herramientas, 'multi script', permitiría la implementación en múltiples instancias:

http://www.red-gate.com/products/dba/sql-multi-script/

Los hemos estado usando por un tiempo y han sido sólidos como una roca y bastante fáciles de entender.

Redgate hace un producto fantástico para esto (en realidad, muchos productos fantásticos). Nuestros administradores de bases de datos lo han utilizado para el mismo propósito de la pregunta (sincronizar entornos/servidores).
Gracias por el consejo, pero realmente no estoy buscando una herramienta DB diff. Quiero poder generar un solo archivo SQL que contenga todo el esquema de una sola instancia de base de datos y luego se aplique a otras instancias de base de datos y actualice sus esquemas de manera idéntica.
@holdenmcgrohen: ¿no es una herramienta de diferenciación de base de datos (con una apariencia ligeramente diferente)?
@Paddy, una herramienta de diferencias toma 2 (o más) bases de datos y analiza las diferencias. Estoy buscando una forma de generar un script basado en solo 1 base de datos.

Un poco tarde, pero agregaré mi consejo solo para que conste: https://www.schemacrawler.com/

Sin embargo, no hará la generación de SQL, tendría que hacerlo usted mismo.

He usado su salida (así como la información de reflexión de las entidades JPA) como entrada a JGraphT (crear gráfico FK) para usar la clasificación topológica para averiguar dónde comenzar a eliminar filas sin romper las restricciones FK. En un mundo de base de datos perfecto, supongo que la eliminación en cascada resolvería el problema, pero...