¿Existe un sistema de control de versiones para los cambios en la estructura de la base de datos?


A menudo me encuentro con el siguiente problema.

Trabajo en algunos cambios en un proyecto que requieren nuevas tablas o columnas en la base de datos. Hago las modificaciones de la base de datos y continúo mi trabajo. Por lo general, recuerdo anotar los cambios para que puedan ser replicados en el sistema en vivo. Sin embargo, no siempre recuerdo lo que he cambiado y no siempre recuerdo escribirlo.

Por lo tanto, hago un empujón al sistema en vivo y obtener un error grande y obvio que no hay NewColumnX, ugh.

Independientemente del hecho de que esta puede no ser la mejor práctica para esta situación, ¿existe un sistema de control de versiones para las bases de datos? No me importa la tecnología de base de datos específica. Sólo quiero saber si existe. Si funciona con MS SQL Server, entonces genial.

Author: Mark Harrison, 2008-08-02

22 answers

En Ruby on Rails, hay un concepto de migración a un script rápido para cambiar la base de datos.

Genera un archivo de migración, que tiene reglas para aumentar la versión de la base de datos (como agregar una columna) y reglas para degradar la versión (como eliminar una columna). Cada migración está numerada y una tabla realiza un seguimiento de la versión actual de la base de datos.

Para migrar hacia arriba, ejecuta un comando llamado "db:migrate" que analiza su versión y aplica los scripts necesarios. Puede migrar hacia abajo de una manera similar.

Los propios scripts de migración se mantienen en un sistema de control de versiones whenever cada vez que cambia la base de datos, se registra un nuevo script, y cualquier desarrollador puede aplicarlo para llevar su base de datos local a la última versión.

 59
Author: Kalid,
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-08-03 04:44:07

Soy un poco de la vieja escuela, ya que uso archivos fuente para crear la base de datos. En realidad hay 2 archivos-proyecto-base de datos.sql y project-updates.sql: el primero para el esquema y los datos persistentes, y el segundo para las modificaciones. Por supuesto, ambos están bajo control de fuente.

Cuando la base de datos cambia, primero actualizo el esquema principal en project-database.sql, luego copie la información relevante a las actualizaciones del proyecto.sql, por ejemplo, instrucciones ALTER TABLE. Luego puedo aplicar las actualizaciones a la base de datos de desarrollo, pruebe, itere hasta que se haga bien. Luego, verifique los archivos, vuelva a probar y aplique a la producción.

Además, normalmente tengo una tabla en db-Config, como:

SQL

CREATE TABLE Config
(
    cfg_tag VARCHAR(50),
    cfg_value VARCHAR(100)
);

INSERT INTO Config(cfg_tag, cfg_value) VALUES
( 'db_version', '$Revision: $'),
( 'db_revision', '$Revision: $');

Luego, agrego lo siguiente a la sección de actualización:

UPDATE Config SET cfg_value='$Revision: $' WHERE cfg_tag='db_revision';

El db_version solo se cambia cuando se vuelve a crear la base de datos, y el db_revision me da una indicación de cuán lejos está la base de datos de la línea de base.

Podría mantener las actualizaciones en sus propios archivos separados, pero elegí triturarlos todos juntos y usar cut & paste para extraer secciones relevantes. Se necesita un poco más de limpieza, por ejemplo, eliminar ':' de Revision Revisión 1.1 to para congelarlos.

 29
Author: dar7yl,
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
2011-05-24 20:36:52

MyBatis (anteriormente iBATIS) tiene una migración de esquema , herramienta para usar en la línea de comandos. Está escrito en java aunque se puede utilizar con cualquier proyecto.

Para lograr una buena práctica de gestión del cambio en la base de datos, necesitamos identificar algunos objetivos clave. Por lo tanto, el Sistema de Migración de Esquemas MyBatis (o Migraciones MyBatis para abreviar) busca:

  • Trabajar con cualquier base de datos, nueva o existente
  • Aproveche el sistema de control de fuentes (p. ej. Subversion)
  • Permitir que los desarrolladores o equipos concurrentes trabajen de forma independiente
  • Permitir conflictos muy visibles y fácilmente manejables
  • Permitir la migración hacia adelante y hacia atrás (evolucionar, devolver respectivamente)
  • Hacer que el estado actual de la base de datos sea fácilmente accesible y comprensible
  • Habilitar migraciones a pesar de privilegios de acceso o burocracia
  • Trabajar con cualquier metodología
  • Fomenta buenas prácticas coherentes
 11
Author: Chadwick,
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-10 21:56:52

Redgate tiene un producto llamado SQL Source Control. Se integra con TFS, SVN, SourceGear Vault, Vault Pro, Mercurial, Perforce y Git.

 11
Author: EndangeredMassa,
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
2011-07-08 14:51:41

La mayoría de los motores de base de datos deberían admitir el volcado de su base de datos en un archivo. Sé que MySQL lo hace, de todos modos. Esto solo será un archivo de texto, por lo que podría enviarlo a Subversion, o lo que sea que use. Sería fácil hacer una diferencia en los archivos también.

 10
Author: Ryan Fox,
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-08-02 01:56:51

Recomiendo encarecidamente SQL delta. Solo lo uso para generar los scripts de diferencias cuando termine de codificar mi característica y comprobar esos scripts en mi herramienta de control de código fuente (Mercurial:))

Ambos tienen una versión de SQL server y Oracle.

 10
Author: Alex,
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-05-28 02:12:15

Me pregunto que nadie mencionó la herramienta de código abierto liquibase que está basada en Java y debería funcionar para casi todas las bases de datos que soportan jdbc. En comparación con rails, utiliza xml en lugar de ruby para realizar los cambios de esquema. Aunque no me gusta xml para lenguajes específicos de dominio la ventaja muy interesante de xml es que liquibase sabe cómo revertir ciertas operaciones como

<createTable tableName="USER"> 
   <column name="firstname" type="varchar(255)"/>
</createTable>

Así que no necesitas manejar esto por tu cuenta

Instrucciones sql puras o importaciones de datos también son compatibles.

 10
Author: Karussell,
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-10 21:26:04

Si está utilizando SQL Server, sería difícil superar a Data Dude (también conocida como la Edición de base de datos de Visual Studio). Una vez que lo domine, hacer una comparación de esquema entre su versión controlada de origen de la base de datos y la versión en producción es muy fácil. Y con un clic puede generar su DDL diff.

Hay un video instructivo en MSDN que es muy útil.

Sé acerca de DBMS_METADATA y Sapo, pero si alguien podría llegar a un Tipo de Datos para Oráculo entonces la vida sería muy dulce.

 8
Author: Perry Tribolet,
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-09-10 19:49:15

Para Oracle, utilizo Toad, que puede volcar un esquema a varios archivos discretos (por ejemplo, un archivo por tabla). Tengo algunos scripts que administran esta colección en Perforce, pero creo que debería ser fácilmente factible en casi cualquier sistema de control de revisiones.

 8
Author: Mark Harrison,
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-01-21 16:07:11

Tenga sus instrucciones iniciales create table en version controller, luego agregue instrucciones alter table, pero nunca edite archivos, solo más alter files idealmente nombrados secuencialmente, o incluso como un "conjunto de cambios", para que pueda encontrar todos los cambios para una implementación en particular.

La parte más dura que puedo ver, es el seguimiento de dependencias, por ejemplo, para un despliegue en particular la tabla B podría necesitar ser actualizada antes de la tabla A.

 7
Author: Matthew Watson,
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-08-31 11:25:21

Eche un vistazo al paquete de oracle DBMS_METADATA.

En particular, los siguientes métodos son particularmente útiles:

  • DBMS_METADATA.GET_DDL
  • DBMS_METADATA.SET_TRANSFORM_PARAM
  • DBMS_METADATA.GET_GRANTED_DDL

Una vez que esté familiarizado con cómo funcionan (bastante autoexplicativo) puede escribir un script simple para volcar los resultados de esos métodos en archivos de texto que se pueden poner bajo control de código fuente. ¡Buena suerte!

No estoy seguro si hay algo tan simple para MSSQL.

 7
Author: Mike Farmer,
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
2016-12-20 05:32:42

Hay un "framework de migración de base de datos" PHP5 llamado Ruckusing. No lo he usado, pero los ejemplos muestran la idea, si usa el lenguaje para crear la base de datos como y cuando sea necesario, solo tiene que rastrear los archivos fuente.

 6
Author: Peter Coulton,
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-08-02 07:48:56

Escribo mis scripts de liberación de db en paralelo con la codificación, y mantengo los scripts de liberación en una sección específica del proyecto en SS. Si hago un cambio en el código que requiere un cambio de bd, entonces actualizo el script de liberación al mismo tiempo. Antes del lanzamiento, corro el script de lanzamiento en una base de datos de desarrollo limpia (copiado de la estructura de producción) y hago mi prueba final en él.

 6
Author: hamishmcn,
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-08-30 18:58:40

He hecho esto de vez en cuando durante años managing administrando (o tratando de administrar) versiones de esquema. Los mejores enfoques dependen de las herramientas que tenga. Si puedes obtener la herramienta de software Quest "Schema Manager" estarás en buena forma. Oracle tiene su propia herramienta, inferior que también se llama "Schema Manager" (confuso mucho?) que no recomiendo.

Sin una herramienta automatizada (vea otros comentarios aquí sobre Data Dude), entonces usará scripts y archivos DDL directamente. Elige un enfoque, documentarlo, y seguirlo rigurosamente. Me gusta tener la capacidad de volver a crear la base de datos en cualquier momento, por lo que prefiero tener una exportación DDL completa de toda la base de datos (si soy el DBA), o del esquema de desarrollador (si estoy en modo de desarrollo de producto).

 6
Author: ,
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-09-15 15:01:05

PLSQL Developer, una herramienta de Todas las automatizaciones de Arround, tiene un plugin para repositorios que funciona bien ( pero no muy bien) con Visual Source Safe.

Desde la web:

El complemento Control de versiones proporciona una estrecha integración entre PL/SQL Developer IDE >>y cualquier Sistema de Control de Versiones que admita la Especificación de Interfaz Microsoft SCC. > > Esto incluye los sistemas de control de versiones más populares, como Microsoft Visual SourceSafe, > > Merant PVCS y MKS Integridad de la Fuente.

Http://www.allroundautomations.com/plsvcs.html

 6
Author: borjab,
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-09-17 15:50:33

ER Studio le permite invertir su esquema de base de datos en la herramienta y luego puede compararlo con bases de datos activas.

Ejemplo: Invierta su esquema de desarrollo en ER Studio compare compárelo con producción y mostrará todas las diferencias. Puede escribir los cambios o simplemente enviarlos automáticamente.

Una vez que tenga un esquema en ER Studio, puede guardar el script de creación o guardarlo como un binario propietario y guardarlo en control de versiones. Si si alguna vez desea volver a una versión anterior del esquema, simplemente compruébelo y envíelo a su plataforma de base de datos.

 5
Author: Bob Probst,
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-01-21 16:08:58

Puede usar Microsoft SQL Server Data Tools en visual studio para generar scripts para objetos de base de datos como parte de un proyecto de SQL Server. A continuación, puede agregar los scripts al control de origen mediante la integración de control de origen integrada en visual studio. Además, los proyectos de SQL Server permiten verificar los objetos de la base de datos mediante un compilador y generar scripts de implementación para actualizar una base de datos existente o crear una nueva.

 3
Author: ,
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
2014-12-22 11:58:25

Hemos utilizado MS Team System Database Edition con bastante éxito. Se integra con TFS version control y Visual Studio más o menos a la perfección y nos permite administrar procs almacenados, vistas, etc., facilmente. La resolución de conflictos puede ser un dolor, pero el historial de versiones se completa una vez que se hace. A partir de entonces, las migraciones a QA y producción son extremadamente simples.

Es justo decir que es un producto de la versión 1.0, sin embargo, y no está exento de algunos problemas.

 2
Author: marc,
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-01-21 16:08:21

Schema Compare for Oracle es una herramienta diseñada específicamente para migrar cambios de nuestra base de datos Oracle a otra. Por favor, visite la siguiente URL para el enlace de descarga, donde podrá utilizar el software para una prueba completamente funcional.

Http://www.red-gate.com/Products/schema_compare_for_oracle/index.htm

 2
Author: David Atkinson,
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-11 22:15:37

En ausencia de un VCS para los cambios de tabla, los he estado registrando en un wiki. Al menos entonces puedo ver cuándo y por qué fue cambiado. Está lejos de ser perfecto, ya que no todo el mundo lo está haciendo y tenemos varias versiones de productos en uso, pero mejor que nada.

 1
Author: steevc,
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-09-01 07:29:33

Dos recomendaciones de libros: "Refactoring Databases" de Ambler y Sadalage y "Agile Database Techniques" de Ambler.

Alguien mencionó las migraciones de Rails. Creo que funcionan muy bien, incluso fuera de las aplicaciones Rails. Los usé en una aplicación ASP con SQL Server que estábamos en el proceso de pasar a Rails. Compruebe los propios scripts de migración en el VCS. He aquí un post del pragmático Dave Thomas sobre el tema.

 1
Author: MattMcKnight,
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-09-22 18:17:48

Recomendaría uno de dos enfoques. Primero, invierte en PowerDesigner de Sybase. Edición Enterprise. Le permite diseñar modelos de datos físicos y mucho más. Pero viene con un repositorio que le permite comprobar en sus modelos. Cada nuevo check in puede ser una nueva versión, puede comparar cualquier versión con cualquier otra versión e incluso con lo que está en su base de datos en ese momento. Luego presentará una lista de cada diferencia y preguntará cuál debe migrarse... y luego construirá el guión para hacerlo. No es barato, pero es una ganga al doble del precio y su ROI es de aproximadamente 6 meses.

La otra idea es activar la auditoría DDL (funciona en Oracle). Esto creará una tabla con cada cambio que hagas. Si consultas los cambios de la marca de tiempo a la que moviste por última vez los cambios de tu base de datos a prod, tendrás una lista ordenada de todo lo que has hecho. Algunas cláusulas where para eliminar cambios de suma cero como crear tabla foo; seguido de drop table foo; y usted puede construir FÁCILMENTE un script mod. Por qué mantener los cambios en un wiki, eso es el doble de trabajo. Deje que la base de datos los rastree por usted.

 1
Author: 2 revs, 2 users 83%Mark Brady,
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-01-21 16:05:45