Personalizar las implementaciones de la base de datos para varios entornos

por Jason Lee

En este tema se describe cómo adaptar las propiedades de una base de datos a entornos de destino específicos como parte del proceso de implementación.

Nota:

En el tema se supone que va a implementar un proyecto de base de datos de Visual Studio 2010 mediante MSBuild.exe y VSDBCMD.exe. Para más información sobre por qué puede elegir este enfoque, vea Implementación web en la empresa e Implementación de proyectos de base de datos.

Al implementar un proyecto de base de datos en varios destinos, a menudo querrá personalizar las propiedades de implementación de la base de datos para cada entorno de destino. Por ejemplo, en entornos de prueba normalmente volvería a crear la base de datos en cada implementación, mientras que en entornos de ensayo o producción sería mucho más probable que realice actualizaciones incrementales para conservar los datos.

En un proyecto de base de datos de Visual Studio 2010, los valores de implementación se incluyen en un archivo de configuración de implementación (.sqldeployment). En este tema se muestra cómo crear archivos de configuración de implementación específicos del entorno y especificar el que quiere usar como parámetro VSDBCMD.

Este tema forma parte de una serie de tutoriales basados en los requisitos de implementación empresarial de una empresa ficticia denominada Fabrikam, Inc. En esta serie de tutoriales se utiliza una solución de ejemplo (Contact Manager) para representar una aplicación web con un nivel de complejidad realista, que incluye una aplicación ASP.NET MVC 3, un servicio Windows Communication Foundation (WCF) y un proyecto de base de datos.

El método de implementación que constituye el núcleo de estos tutoriales se basa en el enfoque del archivo de proyecto dividido descrito en Descripción del archivo del proyecto, en el que el proceso de compilación está controlado por dos archivos de proyecto: uno que contiene las instrucciones de compilación que se aplican a todos los entornos de destino y otro que contiene los ajustes de compilación e implementación específicos del entorno. En tiempo de compilación, el archivo del proyecto específico del entorno se combina en el archivo del proyecto independiente del entorno para formar un conjunto completo de instrucciones de compilación.

Resumen de las tareas

En este tema se supone que:

Para crear un sistema de implementación que admita la variación de las propiedades de implementación de la base de datos entre entornos de destino, tendrá que hacer lo siguiente:

  • Crear un archivo de configuración de implementación (.sqldeployment) para cada entorno de destino.
  • Crear un comando de VSDBCMD que especifique el archivo de configuración de implementación como un modificador de línea de comandos.
  • Parametrizar el comando de VSDBCMD en un archivo del proyecto de Microsoft Build Engine (MSBuild), de modo que las opciones de VSDBCMD sean adecuadas para el entorno de destino.

En este tema se explica cómo realizar cada uno de estos procedimientos.

Creación de archivos de configuración de implementación específicos del entorno

De forma predeterminada, un proyecto de base de datos contiene un único archivo de configuración de implementación denominado Database.sqldeployment. Si abre este archivo en Visual Studio 2010, puede ver las diferentes opciones de implementación disponibles:

  • Intercalación de comparación de implementación. Esto le permite elegir si se va a usar la intercalación de base de datos del proyecto (la intercalación de origen) o la intercalación de base de datos del servidor de destino (la intercalación de destino). En la mayoría de los casos, querrá usar la intercalación de origen al realizar la implementación en un entorno de desarrollo o prueba. Al realizar la implementación en un entorno de ensayo o producción, normalmente querrá dejar la intercalación de destino sin cambios para evitar problemas de interoperabilidad.
  • Implementar propiedades de la base de datos. Esto le permite elegir si se aplican las propiedades de la base de datos, como se definen en el archivo Database.sqlsettings. Al implementar una base de datos por primera vez, debe implementar las propiedades de la base de datos. Si va a actualizar una base de datos existente, las propiedades ya deben estar en vigor y no debe volver a implementarlas.
  • Volver a crear siempre la base de datos. Esto le permite elegir si quiere volver a crear la base de datos de destino cada vez que implemente o realice cambios incrementales para actualizar la base de datos de destino con el esquema. Si vuelve a crear la base de datos, perderá los datos de la base de datos existente. Por tanto, normalmente lo debe establecer en false para las implementaciones en entornos de ensayo o producción.
  • Bloquear la implementación incremental si se puede producir pérdida de datos. Esto le permite elegir si la implementación se debe detener si un cambio en el esquema de la base de datos provocará la pérdida de datos. Normalmente, esto se establece en true para una implementación en un entorno de producción, para ofrecerle la oportunidad de intervenir y proteger los datos importantes. Si ha establecido Volver a crear siempre la base de datos en false, este valor no tendrá ningún efecto.
  • Ejecutar script de implementación en modo de usuario único. Esto no suele ser un problema en entornos de desarrollo o pruebas. Pero normalmente lo debe establecer en false para las implementaciones en entornos de ensayo o producción. Esto impide que los usuarios realicen cambios en la base de datos mientras la implementación está en curso.
  • Realizar copia de seguridad de la base de datos antes de la implementación. Normalmente, esto se establece en true cuando se implementa en un entorno de producción, como medida de precaución contra la pérdida de datos. También puede establecerlo en true cuando se implementa en un entorno de ensayo, si la base de datos de almacenamiento provisional contiene una gran cantidad de datos.
  • Generar instrucciones DROP para objetos que se encuentran en la base de datos de destino, pero que no están en el proyecto de base de datos. En la mayoría de los casos, se trata de una parte integral y esencial de realizar cambios incrementales en una base de datos. Si ha establecido Volver a crear siempre la base de datos en false, este valor no tendrá ningún efecto.
  • No usar instrucciones ALTER ASSEMBLY para actualizar los tipos CLR. Este valor determina cómo debe actualizar SQL Server los tipos de Common Language Runtime (CLR) a las versiones de ensamblado más recientes. Se debe establecer en false en la mayoría de los escenarios.

En esta tabla se muestran los valores de implementación típicos para distintos entornos de destino. Pero pueden ser diferentes en función de los requisitos exactos.

Desarrollador/Prueba Ensayo/Integración Producción
Intercalación de comparación de implementación Source Destino Destino
Implementar propiedades de la base de datos True Solo la primera vez Solo la primera vez
Volver a crear siempre la base de datos True False False
Bloquear la implementación incremental si se puede producir pérdida de datos False Es posible True
Ejecutar script de implementación en modo de usuario único False True True
Realizar copia de seguridad de la base de datos antes de la implementación False Es posible True
Generar instrucciones DROP para objetos que se encuentran en la base de datos de destino, pero que no están en el proyecto de base de datos False True True
No usar instrucciones ALTER ASSEMBLY para actualizar los tipos CLR False False False

Para admitir la implementación de un proyecto de base de datos en varios destinos, debe crear un archivo de configuración de implementación para cada entorno de destino.

Para crear un archivo de configuración específico del entorno

  1. En Visual Studio 2010, en el Explorador de soluciones, haga clic con el botón derecho en el proyecto y, después, haga clic en Propiedades.

  2. En la página de propiedades del proyecto de base de datos, en la pestaña Implementar, en la fila Archivo de configuración de implementación, haga clic en Nuevo.

    On the database project properties page, on the Deploy tab, in the Deployment configuration file row, click New.

  3. En el cuadro de diálogo Nuevo archivo de configuración de implementación, asigne al archivo un nombre descriptivo (por ejemplo, TestEnvironment.sqldeployment) y, después, haga clic en Guardar.

  4. En la página [NombreDeArchivo].sqldeployment, establezca las propiedades de implementación para que coincidan con los requisitos del entorno de destino y guarde el archivo.

    On the Filename .sqldeployment page, set the deployment properties to match the requirements of your destination environment, and then save the file.

  5. Observe que el nuevo archivo se agrega a la carpeta Propiedades del proyecto de base de datos.

    Notice that the new file is added to the Properties folder in your database project.

Especificación del archivo de configuración de implementación en VSDBCMD

Al usar configuraciones de solución (como Depuración y Versión) en Visual Studio 2010, puede asociar un archivo de configuración de implementación a cada configuración. Al compilar una configuración determinada, el proceso de compilación genera un archivo de manifiesto de implementación específico de la configuración que apunta al archivo de configuración de implementación específico de la configuración. Pero uno de los principales objetivos del enfoque de implementación descrito en estos tutoriales es proporcionar a los usuarios la capacidad de controlar el proceso de implementación sin usar las configuraciones de soluciones y Visual Studio 2010. En este enfoque, la configuración de la solución es la misma independientemente del entorno de implementación de destino. Para adaptar la implementación de la base de datos a un entorno de destino específico, puede usar las opciones de línea de comandos de VSDBCMD para especificar el archivo de configuración de implementación.

Para especificar un archivo de configuración de implementación en VSDBCMD, use el modificador p:/DeploymentConfigurationFile y proporcione la ruta de acceso completa al archivo. Esto invalidará el archivo de configuración de implementación que identifica el manifiesto de implementación. Por ejemplo, puede usar este comando VSDBCMD para implementar la base de datos ContactManager en un entorno de prueba:

vsdbcmd.exe /a:Deploy
            /manifest:"…\ContactManager.Database.deploymanifest"
            /cs:"Data Source=TESTDB1;Integrated Security=true"
            /p:TargetDatabase=ContactManager
            /p:DeploymentConfigurationFile=
              "…\ContactManager.Database_TestEnvironment.sqldeployment"
            /dd+
            /script:"…\Publish-ContactManager-Db.sql"

Nota:

Tenga en cuenta que el proceso de compilación puede cambiar el nombre del archivo .sqldeployment cuando copia el archivo en el directorio de salida.

Si usa variables de comando SQL en los scripts SQL anteriores o posteriores a la implementación, puede usar un enfoque similar para asociar un archivo .sqlcmdvars específico del entorno con la implementación. En este caso, se usa el modificador p:/SqlCommandVariablesFile para identificar el archivo .sqlcmdvars.

Ejecución del comando VSDBCMD desde un archivo del proyecto de MSBuild

Puede invocar un comando VSDBCMD desde un archivo del proyecto de MSBuild mediante una tarea Exec dentro de un destino de MSBuild. En su forma más sencilla, tendría el siguiente aspecto:

<Target Name="DeployDatabase">     
   <PropertyGroup>      
      <_Cmd>
         Add your VSDBCMD command here
      </_Cmd>
   </PropertyGroup>
   <Exec Command="$(_Cmd)"/> 
 </Target>
  • En la práctica, para facilitar la lectura y reutilización de los archivos del proyecto, querrá crear propiedades para almacenar los distintos parámetros de la línea de comandos. Esto facilita a los usuarios proporcionar valores de propiedad en un archivo del proyecto específico del entorno o invalidar los valores predeterminados de la línea de comandos de MSBuild. Si usa el enfoque de archivo del proyecto dividido descrito en Descripción del archivo de proyecto, debe dividir las instrucciones de compilación y las propiedades entre los dos archivos en consecuencia:
  • Los valores específicos del entorno, como el nombre del archivo de configuración de implementación, la cadena de conexión de base de datos y el nombre de la base de datos de destino, deben ir en el archivo del proyecto específico del entorno.
  • El destino de MSBuild que ejecuta el comando VSDBCMD, junto con cualquier propiedad universal, como la ubicación del ejecutable VSDBCMD, debe ir en el archivo del proyecto universal.

También debe asegurarse de compilar el proyecto de base de datos antes de invocar VSDBCMD para que el archivo .deploymanifest se cree y esté listo para usarse. Puede ver un ejemplo completo de este enfoque en el tema Descripción del proceso de compilación, en el que se le guía por los archivos del proyecto en la solución de ejemplo Contact Manager.

Conclusión

En este tema se ha descrito cómo puede adaptar las propiedades de la base de datos a distintos entornos de destino al implementar proyectos de base de datos mediante MSBuild y VSDBCMD. Este enfoque es útil cuando necesita implementar proyectos de base de datos como parte de soluciones de escala empresarial más grandes. Estas soluciones a menudo se implementan en varios destinos, como entornos de desarrollo o pruebas de espacio aislado, plataformas de ensayo o integración, y entornos de producción o en directo. Cada uno de estos entornos de destino normalmente requiere un conjunto único de propiedades de implementación de base de datos.

Lecturas adicionales

Para más información sobre la implementación de proyectos de base de datos mediante VSDBCMD.exe, vea Implementación de proyectos de base de datos. Para más información sobre el uso de archivos del proyecto de MSBuild personalizados para controlar el proceso de implementación, vea Descripción del archivo del proyecto y Descripción del proceso de compilación.

En estos artículos de MSDN se proporcionan instrucciones más generales sobre la implementación de bases de datos: