sql-server - una - sql server version query




Versiones de la base de datos de SQL Server (20)

Quiero tener mis bases de datos bajo control de versión. ¿Alguien tiene algún consejo o artículos recomendados para que comience?

Siempre alumb tener al menos algunos datos allí (como se menciona alumb : tipos de usuarios y administradores). También a menudo querré una gran colección de datos de prueba generados para las mediciones de rendimiento.


+1 para todos los que hayan recomendado las herramientas de RedGate, con una recomendación adicional y una advertencia.

SqlCompare también tiene una API documentada decentemente: así, por ejemplo, puede escribir una aplicación de consola que sincronice su carpeta de scripts controlados de origen con una base de datos de pruebas de integración de CI en el registro, de modo que cuando alguien verifique un cambio en el esquema desde su carpeta de scripts se implementa automáticamente junto con el cambio de código de la aplicación correspondiente. Esto ayuda a cerrar la brecha con los desarrolladores que olvidan propagar cambios en su base de datos local hasta un DB de desarrollo compartido (aproximadamente la mitad de nosotros, creo :)).

Una advertencia es que con una solución de script o de otro tipo, las herramientas de RedGate son lo suficientemente suaves como para que sea fácil olvidar las realidades de SQL subyacentes a la abstracción. Si cambia el nombre de todas las columnas de una tabla, SqlCompare no tiene forma de asignar las columnas antiguas a las nuevas columnas y eliminará todos los datos de la tabla. Generará advertencias, pero he visto a gente hacer clic más allá de eso. Creo que hay un punto general que vale la pena señalar: hasta ahora, solo se puede automatizar la versión y actualización de la base de datos, ya que las abstracciones son muy permisivas.


Acabamos de empezar a usar Team Foundation Server. Si su base de datos es de tamaño mediano, entonces Visual Studio tiene algunas integraciones de proyectos agradables con funciones integradas de comparación, comparación de datos, refactorización de base de datos, marco de prueba de base de datos e incluso herramientas de generación de datos.

Pero, ese modelo no se ajusta a bases de datos muy grandes o de terceros (que cifran objetos) muy bien. Entonces, lo que hemos hecho es almacenar solo nuestros objetos personalizados. Visual Studio / Team Foundation Server funciona muy bien para eso.

Base de datos TFS principal arco. Blog

Sitio de MS TFS


Cada base de datos debe estar bajo control de código fuente. Lo que falta es una herramienta que guarde automáticamente todos los objetos de la base de datos, y los "datos de configuración", que se pueden agregar a cualquier sistema de control de origen. Si está utilizando SQL Server, mi solución está aquí: http://dbsourcetools.codeplex.com/ . Que te diviertas. - Nathan.


Con VS 2010, usa el proyecto Base de datos.

  1. Guarde su base de datos
  2. Realice cambios a los scripts o directamente en su servidor db
  3. Sincronizar usando Datos> Comparación de esquemas

Hace una solución de versionamiento de DB perfecta, y hace que la sincronización de DB sea una brisa.


Echa un vistazo a DBGhost DBGhost . He utilizado de forma automatizada durante 2 años y funciona muy bien. Permite que nuestras compilaciones de base de datos se realicen de forma muy similar a como ocurre una compilación de Java o C, excepto la base de datos. Sabes a lo que me refiero.


El producto de comparación SQL de Red Gate no solo le permite hacer comparaciones a nivel de objeto y generar scripts de cambio a partir de eso, sino que también le permite exportar sus objetos de base de datos a una jerarquía de carpetas organizada por tipo de objeto, con una creación de [nombre de objeto] .sql script por objeto en estos directorios. La jerarquía de tipo de objeto es así:

\ Funciones
\Seguridad
\ Seguridad \ Roles
\ Seguridad \ Esquemas
\ Seguridad \ Usuarios
\Procedimientos almacenados
\Mesas

Si vuelca sus scripts al mismo directorio raíz después de hacer cambios, puede usar esto para actualizar su repositorio SVN y mantener un historial de cada objeto individualmente.


Es posible que desee consultar Liquibase ( http://www.liquibase.org/ ). Incluso si no utiliza la herramienta en sí misma, maneja muy bien los conceptos de gestión de cambio de base de datos o refactorización.


Es sencillo.

  1. Cuando el proyecto base esté listo, debe crear un script de base de datos completo. Este script está comprometido con SVN. Es la primera versión.

  2. Después de eso, todos los desarrolladores crean scripts de cambio (ALTER ..., nuevas tablas, sprocs, etc.).

  3. Cuando necesite la versión actual, debe ejecutar todos los nuevos scripts de cambio.

  4. Cuando la aplicación se lanza a producción, vuelve a 1 (pero, por supuesto, será una versión sucesiva).

Nant te ayudará a ejecutar esos scripts de cambio. :)

Y recuerda. Todo funciona bien cuando hay disciplina. Cada vez que se compromete el cambio de la base de datos, también se comprometen las funciones correspondientes en el código.


Es una pregunta muy antigua, sin embargo, muchos están tratando de resolver esto incluso ahora. Todo lo que tienen que hacer es investigar sobre los proyectos de bases de datos de Visual Studio. Sin esto, cualquier desarrollo de base de datos parece muy débil. Desde la organización del código hasta la implementación y el control de versiones, simplifica todo.


Escribí esta aplicación hace un tiempo, http://sqlschemasourcectrl.codeplex.com/ , que escaneará sus db de MSFT SQL con la frecuencia que desee y volcará automáticamente sus objetos (tablas, vistas, procs, funciones, configuración de SQL) en SVN. Funciona de maravilla. Lo uso con Unfuddle (que me permite recibir alertas en los registros)


Estoy de acuerdo con la respuesta de ESV y por esa razón, comencé un pequeño proyecto hace un tiempo para ayudar a mantener las actualizaciones de la base de datos en un archivo muy simple que luego se podría mantener con un código fuente muy largo. Permite actualizaciones fáciles para los desarrolladores, así como UAT y Producción. La herramienta funciona en Sql Server y MySql.

Algunas características del proyecto:

  • Permite cambios de esquema
  • Permite valorar la población del árbol.
  • Permite inserciones de datos de prueba por separado para, por ejemplo. UAT
  • Permite la opción de reversión (no automatizada)
  • Mantiene soporte para servidor SQL y Mysql
  • Tiene la capacidad de importar su base de datos existente en el control de versiones con un comando simple (solo servidor sql ... aún trabajando en mysql)

El código está alojado en el código de Google. Por favor revisa el código de Google para más información.

http://code.google.com/p/databaseversioncontrol/


Hace un tiempo encontré un módulo básico de VB que usaba objetos DMO y VSS para obtener un db completo en el script de VSS. Lo convertí en un VB Script y lo publiqué here . ¿Podría fácilmente sacar las llamadas de VSS y usar el material de DMO para generar todos los scripts, y luego llamar a SVN desde el mismo archivo por lotes que llama a VBScript para verificarlos?

Dave J


Martin Fowler escribió mi artículo favorito sobre el tema, http://martinfowler.com/articles/evodb.html . Elijo no colocar volcados de esquemas bajo el control de versiones como alumb y otros sugieren, porque quiero una manera fácil de actualizar mi base de datos de producción.

Para una aplicación web donde tendré una sola instancia de base de datos de producción, uso dos técnicas:

Scripts de actualización de base de datos

Una secuencia de comandos de actualización de la base de datos que contiene el DDL necesario para mover el esquema de la versión N a N + 1. (Estos van en su sistema de control de versiones.) Una tabla _version_history_, algo como

create table VersionHistory (
    Version int primary key,
    UpgradeStart datetime not null,
    UpgradeEnd datetime
    );

obtiene una nueva entrada cada vez que se ejecuta un script de actualización que corresponde a la nueva versión.

Esto garantiza que sea fácil ver qué versión del esquema de la base de datos existe y que los scripts de actualización de la base de datos se ejecutan solo una vez. Una vez más, estos no son volcados de base de datos. Más bien, cada script representa los cambios necesarios para pasar de una versión a la siguiente. Son el script que usted aplica a su base de datos de producción para "actualizarlo".

Desarrollador Sandbox Synchronization

  1. Un script para respaldar, sanear y reducir una base de datos de producción. Ejecute esto después de cada actualización a la base de datos de producción.
  2. Un script para restaurar (y modificar, si es necesario) la copia de seguridad en la estación de trabajo de un desarrollador. Cada desarrollador ejecuta este script después de cada actualización a la base de datos de producción.

Una advertencia: mis pruebas automatizadas se ejecutan en una base de datos con esquemas correctos pero vacía, por lo que este consejo no se ajustará perfectamente a sus necesidades.


No almacenamos el esquema de la base de datos, almacenamos los cambios en la base de datos. Lo que hacemos es almacenar los cambios de esquema para que construyamos un script de cambio para cualquier versión de la base de datos y lo apliquemos a las bases de datos de nuestros clientes. Escribí una aplicación de utilidad de base de datos que se distribuye con nuestra aplicación principal que puede leer ese script y saber qué actualizaciones deben aplicarse. También tiene suficiente inteligencia para actualizar vistas y procedimientos almacenados según sea necesario.


Para hacer que el volcado a un sistema de control de código fuente sea un poco más rápido, puede ver qué objetos han cambiado desde la última vez utilizando la información de la versión en sysobjects.

Configuración: cree una tabla en cada base de datos que desee verificar de forma incremental para contener la información de la versión de la última vez que la verificó (vacía en la primera ejecución). Borre esta tabla si desea volver a escanear toda su estructura de datos.

IF ISNULL(OBJECT_ID('last_run_sysversions'), 0) <> 0 DROP TABLE last_run_sysversions
CREATE TABLE last_run_sysversions (
    name varchar(128), 
    id int, base_schema_ver int,
    schema_ver int,
    type char(2)
)

Modo de ejecución normal: puede tomar los resultados de este sql, y generar scripts de sql solo para los que le interesan, y ponerlos en un control de origen de su elección.

IF ISNULL(OBJECT_ID('tempdb.dbo.#tmp'), 0) <> 0 DROP TABLE #tmp
CREATE TABLE #tmp (
    name varchar(128), 
    id int, base_schema_ver int,
    schema_ver int,
    type char(2)
)

SET NOCOUNT ON

-- Insert the values from the end of the last run into #tmp
INSERT #tmp (name, id, base_schema_ver, schema_ver, type) 
SELECT name, id, base_schema_ver, schema_ver, type FROM last_run_sysversions

DELETE last_run_sysversions
INSERT last_run_sysversions (name, id, base_schema_ver, schema_ver, type)
SELECT name, id, base_schema_ver, schema_ver, type FROM sysobjects

-- This next bit lists all differences to scripts.
SET NOCOUNT OFF

--Renamed.
SELECT 'renamed' AS ChangeType, t.name, o.name AS extra_info, 1 AS Priority
FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id
WHERE o.name <> t.name /*COLLATE*/
AND o.type IN ('TR', 'P' ,'U' ,'V')
UNION 

--Changed (using alter)
SELECT 'changed' AS ChangeType, o.name /*COLLATE*/, 
       'altered' AS extra_info, 2 AS Priority
FROM sysobjects o INNER JOIN #tmp t ON o.id = t.id 
WHERE (
   o.base_schema_ver <> t.base_schema_ver
OR o.schema_ver      <> t.schema_ver
)
AND  o.type IN ('TR', 'P' ,'U' ,'V')
AND  o.name NOT IN ( SELECT oi.name 
         FROM sysobjects oi INNER JOIN #tmp ti ON oi.id = ti.id
         WHERE oi.name <> ti.name /*COLLATE*/
         AND oi.type IN ('TR', 'P' ,'U' ,'V')) 
UNION

--Changed (actually dropped and recreated [but not renamed])
SELECT 'changed' AS ChangeType, t.name, 'dropped' AS extra_info, 2 AS Priority
FROM #tmp t
WHERE    t.name IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
         WHERE NOT EXISTS (SELECT * FROM sysobjects oi
                           WHERE oi.id = ti.id))
AND  t.name IN ( SELECT oi.name /*COLLATE*/ FROM sysobjects oi
         WHERE NOT EXISTS (SELECT * FROM #tmp ti
                           WHERE oi.id = ti.id)
         AND   oi.type  IN ('TR', 'P' ,'U' ,'V'))
UNION

--Deleted
SELECT 'deleted' AS ChangeType, t.name, '' AS extra_info, 0 AS Priority
FROM #tmp t
WHERE NOT EXISTS (SELECT * FROM sysobjects o
                  WHERE o.id = t.id)
AND t.name NOT IN (  SELECT oi.name /*COLLATE*/ FROM sysobjects oi
         WHERE NOT EXISTS (SELECT * FROM #tmp ti
                           WHERE oi.id = ti.id)
         AND   oi.type  IN ('TR', 'P' ,'U' ,'V'))
UNION

--Added
SELECT 'added' AS ChangeType, o.name /*COLLATE*/, '' AS extra_info, 4 AS Priority
FROM sysobjects o
WHERE NOT EXISTS (SELECT * FROM #tmp t
                  WHERE o.id = t.id)
AND      o.type  IN ('TR', 'P' ,'U' ,'V')
AND  o.name NOT IN ( SELECT ti.name /*COLLATE*/ FROM #tmp ti
         WHERE NOT EXISTS (SELECT * FROM sysobjects oi
                           WHERE oi.id = ti.id))
ORDER BY Priority ASC

Nota: Si utiliza una intercalación no estándar en cualquiera de sus bases de datos, deberá reemplazar /* COLLATE */ con su intercalación de base de datos. es decir, COLLATE Latin1_General_CI_AI


Primero, debe elegir el sistema de control de versiones que sea adecuado para usted:

  • Sistema de control de versiones centralizado: un sistema estándar en el que los usuarios realizan el check-out / check-in antes / después de trabajar en los archivos, y los archivos se guardan en un único servidor central.

  • Sistema de control de versiones distribuido: un sistema donde se clona el repositorio, y cada clon es en realidad la copia de seguridad completa del repositorio, por lo que si un servidor se bloquea, se puede usar cualquier repositorio clonado para restaurarlo. Después de elegir el sistema adecuado para sus necesidades , deberá configurar el repositorio, que es el núcleo de cada sistema de control de versiones. Todo esto se explica en el siguiente artículo: http://solutioncenter.apexsql.com/sql-server-source-control-part-i-understanding-source-control-basics/

Después de configurar un repositorio, y en el caso de un sistema central de control de versiones, una carpeta de trabajo, puede leer este artículo . Muestra cómo configurar el control de origen en un entorno de desarrollo utilizando:

  • SQL Server Management Studio a través del proveedor MSSCCI,

  • Visual Studio y SQL Server Data Tools

  • Una herramienta de terceros ApexSQL Source Control

También estoy usando una versión en la base de datos almacenada a través de la familia de procedimientos de base de datos extendida de la base de datos. Mi aplicación tiene scripts para cada paso de la versión (es decir, pasar de 1.1 a 1.2). Cuando se implementa, examina la versión actual y luego ejecuta los scripts uno por uno hasta que llega a la última versión de la aplicación. No hay ningún script que tenga la versión "final" directa, incluso si se implementa en una base de datos limpia, se implementa mediante una serie de pasos de actualización.

Ahora, lo que me gusta agregar es que hace dos días vi una presentación en el campus de MS sobre la nueva y próxima edición de VS DB. La presentación se centró específicamente en este tema y fui expulsado del agua. Definitivamente debería comprobarlo, las nuevas instalaciones se centran en mantener la definición del esquema en los scripts T-SQL (CREATE), un motor delta en tiempo de ejecución para comparar el esquema de implementación con el esquema definido y realizar los ALTER delta y la integración con la integración del código fuente, hasta e incluyendo la integración continua de MSBUILD para la generación de compilaciones automatizadas. La caída contendrá un nuevo tipo de archivo, los archivos .dbschema, que se pueden llevar al sitio de implementación y una herramienta de línea de comandos puede hacer los 'deltas' reales y ejecutar la implementación. Tengo una entrada de blog sobre este tema con enlaces a las descargas de VSDE, debe consultarlas: http://rusanu.com/2009/05/15/version-control-and-your-database/


También podría mirar una solución de migraciones. Estos le permiten especificar el esquema de su base de datos en el código C #, y subir y bajar la versión de su base de datos usando MSBuild.

Actualmente estoy usando DbUp , y ha estado funcionando bien.


Usamos DBGhost para administrar nuestra base de datos SQL. Luego, coloca sus scripts para construir una nueva base de datos en su control de versión, y construirá una nueva base de datos o actualizará cualquier base de datos existente al esquema en el control de versión. De esa manera, no tiene que preocuparse por crear scripts de cambio (aunque aún puede hacerlo, si por ejemplo desea cambiar el tipo de datos de una columna y necesita convertir datos).


Yo sugeriría usar herramientas de comparación para improvisar un sistema de control de versiones para su base de datos. Una buena alternativa son xSQL Schema Compare y xSQL Data Compare .

Ahora, si su objetivo es tener solo el esquema de la base de datos bajo el control de versiones, simplemente puede usar la Comparación de esquemas de xSQL para generar instantáneas de xSQL del esquema y agregar estos archivos en su control de versiones. Luego, para revertir o actualizar a una versión específica, simplemente compare la versión actual de la base de datos con la instantánea de la versión de destino.

Por desgracia, si también desea tener los datos bajo el control de versiones, puede usar xSQL Data Compare para generar scripts de cambio para su base de datos y agregar los archivos .sql a su control de versiones. Luego puede ejecutar estos scripts para revertir / actualizar a cualquier versión que desee. Tenga en cuenta que para la funcionalidad 'revertir' necesita generar scripts de cambio que cuando se ejecuten hará que la Versión 3 sea igual a la versión 2 y para la funcionalidad 'actualizar', necesita generar scripts de cambio que hagan lo contrario.

Por último, con algunas habilidades básicas de programación por lotes, puede automatizar todo el proceso utilizando las versiones de línea de comandos de Comparación de esquemas xSQL y Comparación de datos xSQL

Descargo de responsabilidad: estoy afiliado a xSQL.





version-control