¿Cómo rastrea los cambios en la base de datos en el control de código fuente?


Utilizamos SQL Server 2000/2005 y Vault o SVN en la mayoría de nuestros proyectos. No he encontrado una solución decente para capturar cambios de esquema/proc de base de datos en cualquiera de los sistemas de control de código fuente.

Nuestra solución actual es bastante engorrosa y difícil de aplicar (script fuera del objeto que cambia y lo confirma en la base de datos).

Tenemos muchas ideas sobre cómo abordar este problema con un desarrollo personalizado, pero prefiero instalar una herramienta existente (las herramientas de pago son fino).

Entonces: ¿cómo rastrea los cambios en el código de su base de datos? ¿Tiene alguna herramienta recomendada?


Editar:

Gracias por todas las sugerencias. Debido a las limitaciones de tiempo, prefiero no rodar mi propio aquí. Y la mayoría de las sugerencias tienen el defecto de que requieren que el dev siga algún procedimiento.

En su lugar, una solución ideal supervisaría la base de datos SQL en busca de cambios y confirmaría cualquier cambio detectado en SCM. Por ejemplo, si SQL Server tenía un complemento que podría grabar cualquier cambio DML con el usuario que hizo el cambio, luego confirmar el script de ese objeto a SCM, estaría encantado.

Hablamos internamente sobre dos sistemas: 1. En SQL 2005, use permisos de objeto para restringir la alteración de un objeto hasta que realice un "checkout". Luego, el procedimiento checkin lo escribiría en el SCM. 2. Ejecute un trabajo programado para detectar cualquier cambio y confirmarlo (de forma anónima) a SCM.

Sería bueno si pudiera saltarme la parte de acción del usuario y haga que el sistema maneje todo esto automáticamente.

Author: Michael Haren, 2008-12-09

14 answers

Utilice Visual studio database edition para crear scripts en su base de datos. Funciona como un encanto y se puede utilizar cualquier sistema de control de código fuente, por supuesto, mejor si tiene VS plugins. Esta herramienta también tiene una serie de otras características útiles. Échales un vistazo aquí en esta gran entrada de blog

Http://www.vitalygorn.com/blog/post/2008/01/Handling-Database-easily-with-Visual-Studio-2008.aspx

O echa un vistazo a MSDN para la documentación oficial

 15
Author: terjetyl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-09 14:08:50

El seguimiento de los cambios en la base de datos directamente desde SSMS es posible utilizando varias herramientas de terceros. ApexSQL Source Control escribe automáticamente cualquier objeto de base de datos que esté incluido en el control de versiones. Las confirmaciones no pueden ser realizadas automáticamente por la herramienta. En su lugar, el usuario debe elegir qué cambios se confirmarán.

Al obtener cambios desde un repositorio, ApexSQL Source Control es consciente de la integridad referencial de una base de datos SQL. Por lo tanto, se creará un scripts de sincronización incluyendo todos los objetos dependientes que serán envueltos en una transacción, o bien todos los cambios serán aplicados en caso de que no se encuentre ningún error, o ninguno de los cambios seleccionados es aplicado. En cualquier caso, la integridad de la base de datos no se ve afectada.

 6
Author: D.Blosch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-08 08:12:07

Tengo que decir que creo que un proyecto de base de datos de visual studio también es una solución razonable para el dilema de control de código fuente. Si está configurado correctamente, puede ejecutar los scripts en la base de datos desde el IDE. Si su script es antiguo, obtenga el último, ejecútelo contra la base de datos. Tener un script que recrea todos los objetos también si es necesario, los nuevos objetos deben añadirse a este script también a mano, pero solo una vez

Me gusta que cada tabla, proc y función estén en su propio archivo.

 5
Author: Robert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-09 14:19:25

La solución de un hombre pobre sería agregar un script de gancho pre-commit que vuelque el último esquema de bd en un archivo y haga que ese archivo se confirme en su repositorio SVN junto con su código. A continuación, puede diferenciar los archivos de esquema de la base de datos de cualquier revisión.

 3
Author: Marcus,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-09 14:01:27

Acabo de confirmar la instrucción SQL-alter-adicional a la instrucción SQL-CreateDB-completa.

 1
Author: berlindev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-09 14:01:34

Rodar el suyo desde cero no sería muy factible, pero si usa una herramienta de comparación sql como Redgate SQL Compare SDK para generar sus archivos de cambio por usted, no tardaría mucho en rodar a la mitad lo que desea y luego simplemente verifique esos archivos en el control de código fuente. Hice algo similar para mí para actualizar los cambios de nuestros sistemas de desarrollo a nuestros sistemas en vivo en solo unas pocas horas.

 1
Author: MonkeyBrother,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-09 14:34:20

En nuestro entorno, nunca cambiamos la base de datos manualmente: todos los cambios son realizados por scripts en el momento de la publicación, y los scripts se mantienen en el sistema de control de versiones. Una parte importante de este procedimiento es asegurarse de que todos los scripts se pueden ejecutar de nuevo contra la misma base de datos ¿los scripts son idempotentes?) sin pérdida de datos. Por ejemplo, si agrega una columna, asegúrese de no hacer nada si la columna ya está allí.

Su comentario sobre " sugerencias tienen el defecto de que requieren la dev para seguir algún procedimiento " es realmente un testigo. No es un defecto, es una característica. El control de versiones ayuda a los desarrolladores a seguir los procedimientos y hace que los procedimientos sean menos dolorosos. Si no desea seguir los procedimientos, no necesita control de versiones.

 1
Author: Arkadiy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-09 16:32:44
 1
Author: Yuval F,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-15 13:00:20

En SQL2000 genere cada objeto en su propio archivo, luego verifique todos en su control de código fuente. Deje que su control de origen maneje el historial de cambios.

En SQL 2005, necesitará escribir un poco de código para generar todos los objetos en archivos separados.

 1
Author: John MacIntyre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-21 19:41:14

En un proyecto arreglé cuidadosamente en el diseño que todos los datos importantes en la base de datos se pueden recrear automáticamente desde lugares externos. Al iniciar la aplicación crea la base de datos si falta, y la rellena desde fuentes de datos externas, utilizando un esquema en el código fuente de la aplicación (y por lo tanto versionado con la aplicación). El nombre del almacén de bases de datos (un nombre de archivo sqlite, aunque la mayoría de los administradores de bases de datos permiten varias bases de datos) incluye una versión de esquema, y aumentamos la versión del esquema cada vez que confirmamos un cambio de esquema. Esto significa que cuando reiniciamos la aplicación a una nueva versión con un esquema diferente, se crea y rellena automáticamente un nuevo almacén de bases de datos. En caso de que tengamos que revertir una implementación a un esquema antiguo, la nueva ejecución de la versión antigua utilizará el antiguo almacén de bases de datos, por lo que podemos hacer degradaciones rápidas en caso de problemas.

Esencialmente, la base de datos actúa como un montón de aplicaciones tradicional, con el ventajas de la persistencia, la seguridad de las transacciones, la escritura estática (útil ya que usamos Python) y las restricciones de singularidad. Sin embargo, no nos preocupamos en absoluto por eliminar la base de datos y comenzar de nuevo, y la gente sabe que si intentan algún hack manual en la base de datos, entonces se revertirá en la próxima implementación, al igual que los hackeos de un estado de proceso se revertirán en el siguiente reinicio.

No necesitamos ningún script de migración ya que solo cambiamos el nombre del archivo de la base de datos y reiniciamos la aplicación y se reconstruye a sí mismo. Ayuda que las instancias de la aplicación estén divididas para usar una base de datos por cliente. También reduce la necesidad de copias de seguridad de bases de datos.

Este enfoque no funcionará si la compilación de la base de datos a partir de fuentes externas tarda más de lo que permitirá que la aplicación permanezca inactiva.

 0
Author: Dickon Reed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-15 13:14:43

Si está utilizando. Net y le gusta el enfoque que Rails toma con las migraciones, entonces le recomendaría Migrator.Net .

Encontré un buen tutorial que recorre la configuración en Visual Studio. También proporciona un proyecto de ejemplo para referencia.

 0
Author: ern,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-18 18:03:25

Desarrollamos una herramienta personalizada que actualiza nuestras bases de datos. El esquema de la base de datos se almacena en un archivo XML neutro que luego es leído y procesado por la herramienta. El esquema se almacena en SVN, y añadimos el comentario apropiado para mostrar lo que se ha cambiado. Funciona bastante bien para nosotros.

Si bien este tipo de solución es definitivamente exagerada para la mayoría de los proyectos, ciertamente hace la vida más fácil a veces.

 0
Author: Jon Seigel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-18 18:15:04

Nuestros dba verifican periódicamente prod contra lo que está en SVN y eliminan cualquier objeto que no esté bajo control de código fuente. Solo se necesita una vez antes de que los devlopers nunca olviden poner algo en el control de código fuente de nuevo.

Tampoco permitimos que nadie mueva objetos a prod sin un script, ya que nuestros desarrolladores no tienen derechos de prod.

 0
Author: HLGEM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-07-21 19:44:27

Para realizar un seguimiento de todos los cambios, como insertar actualización y eliminar, habrá una gran sobrecarga para el SVN. Es mejor realizar un seguimiento solo de los cambios ddl como (alter, drop, create) que cambia el esquema. Puede realizar este seguimiento de esquema fácilmente creando una tabla y un trgger para insertar datos en esa tabla. En cualquier momento que desee u puede obtener el estado de cambio consultando desde esa tabla Hay un montón de ejemplo aquí y aquí

 0
Author: sudhAnsu63,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-26 15:02:31