Implementar proyectos de base de datos

por Jason Lee

Nota:

En muchos escenarios de implementación empresarial, necesita la capacidad de publicar actualizaciones incrementales en una base de datos implementada. La alternativa consiste en volver a crear la base de datos en cada implementación, lo que significa que se pierden los datos de la base de datos existente. Al trabajar con Visual Studio 2010, el uso de VSDBCMD es el enfoque recomendado para la publicación incremental de bases de datos. Pero en la siguiente versión de Visual Studio y la canalización de publicación web (WPP) se incluirán herramientas que admiten la publicación incremental directamente.

Si abre la solución de ejemplo Contact Manager en Visual Studio 2010, verá que el proyecto de base de datos incluye una carpeta Properties que contiene cuatro archivos.

If you open the Contact Manager sample solution in Visual Studio 2010, you'll see that the database project includes a Properties folder that contains four files.

Junto con el archivo del proyecto (ContactManager.Database.dbproj en este caso) estos archivos controlan varios aspectos del proceso de compilación e implementación:

  • El archivo Database.sqlcmdvars proporciona valores para cualquier variable SQLCMD que use al implementar el proyecto. Cada configuración de solución (por ejemplo, las de depuración y versión) puede especificar un archivo .sqlcmdvars diferente.
  • El archivo Database.sqldeployment proporciona valores específicos de la implementación, como si se usa la intercalación definida en el proyecto o la intercalación del servidor de destino, si se debe volver a crear la base de datos de destino cada vez o modificar la base de datos existente para que se actualice, etc. Cada configuración de solución puede especificar un archivo .sqldeployment diferente.
  • El archivo Database.sqlpermissions es un documento XML que puede usar para definir los permisos que quiere agregar a la base de datos de destino. Todas las configuraciones de solución comparten el mismo archivo .sqlpermissions.
  • El archivo Database.sqlsettings especifica las propiedades de nivel de base de datos que se usarán al crear la base de datos, como la intercalación que se va a usar, el comportamiento de los operadores de comparación, etc. Todas las configuraciones de solución comparten el mismo archivo .sqlsettings.

Vale la pena dedicar un momento a abrir estos archivos en Visual Studio y familiarizarse con el contenido.

Al crear un proyecto de base de datos, el proceso de compilación crea dos archivos:

  • Un esquema de base de datos (archivo.dbschema). En este artículo se describe el esquema de la base de datos que quiere crear en formato XML.
  • Un manifiesto de implementación (archivo.deploymanifest). Contiene toda la información necesaria para crear e implementar la base de datos. Hace referencia al archivo .dbschema junto con otros recursos, como las instrucciones de implementación (el archivo .sqldeployment) y los scripts SQL anteriores o posteriores a la implementación.

Esto muestra la relación entre estos recursos:

The relationship between the above resources

Como puede ver, los archivos .sqlsettings y .sqlpermissions son entradas para el proceso de compilación. Junto con el archivo del proyecto de base de datos, estos archivos se usan para crear el archivo de esquema de base de datos. Los archivos .sqldeployment y .sqlcmdvars pasan por el proceso de compilación sin cambios. El manifiesto de implementación indica la ubicación del esquema de base de datos, el archivo .sqldeployment, el archivo .sqlcmdvars y los scripts SQL anteriores o posteriores a la implementación.

¿Por qué usar VSDBCMD para implementar un proyecto de base de datos?

Hay varios enfoques diferentes para implementar proyectos de base de datos. Pero no todos ellos son adecuados para implementar un proyecto de base de datos en servidores remotos en un entorno empresarial. Tenga en cuenta lo que quiere de una implementación de proyecto de base de datos. En escenarios de implementación empresarial, es probable que quiera lo siguiente:

  • La capacidad de implementar el proyecto de base de datos desde una ubicación remota.
  • La capacidad de realizar actualizaciones incrementales en una base de datos existente.
  • La capacidad de incluir scripts anteriores o posteriores a la implementación.
  • La capacidad de adaptar la implementación a varios entornos de destino.
  • La capacidad de implementar el proyecto de base de datos como parte de la implementación de una solución de un solo paso más grande, normalmente con scripts.

Hay tres enfoques principales que puede usar para implementar un proyecto de base de datos:

  • Puede usar la funcionalidad de implementación con el tipo de proyecto de base de datos en Visual Studio 2010. Al compilar e implementar un proyecto de base de datos en Visual Studio 2010, el proceso de implementación usa el manifiesto de implementación para generar un archivo de implementación basado en SQL específico de la configuración de compilación. Esto creará la base de datos si aún no existe, o bien realizará cambios necesarios en la base de datos si ya existe. Puede usar SQLCMD.exe para ejecutar este archivo en el servidor de destino, o bien puede establecer Visual Studio para crear y ejecutar el archivo. La desventaja de este enfoque es que solo tiene un control limitado sobre la configuración de implementación. A menudo, es posible que también necesite modificar el archivo de implementación SQL para proporcionar valores de variable específicos del entorno. Solo puede usar este enfoque desde un equipo con Visual Studio 2010 instalado, y el desarrollador tendría que saber y proporcionar cadenas de conexión y credenciales para todos los entornos de destino.
  • Puede usar la Herramienta de implementación web de Internet Information Services (IIS) (Web Deploy) para implementar una base de datos como parte de un proyecto de aplicación web. Pero este enfoque es mucho más complejo si quiere implementar un proyecto de base de datos en lugar de simplemente replicar una base de datos local existente en un servidor de destino. Puede configurar Web Deploy para ejecutar el script de implementación de SQL que genera el proyecto de base de datos, pero para ello, debe crear un archivo de destinos WPP personalizado para el proyecto de aplicación web. Esto agrega una cantidad considerable de complejidad al proceso de implementación. Además, Web Deploy no admite directamente las actualizaciones incrementales de las bases de datos existentes. Para más información sobre este enfoque, vea Extensión de la canalización de publicación web para empaquetar el archivo SQL implementado en el proyecto de base de datos.
  • Puede usar la utilidad VSDBCMD para implementar la base de datos mediante el esquema de base de datos o el manifiesto de implementación. Puede llamar a VSDBCMD.exe desde un destino de MSBuild, lo que le permite publicar bases de datos como parte de un proceso de implementación con scripts más grande. Puede invalidar las variables en el archivo .sqlcmdvars y muchas otras propiedades de base de datos desde un comando VSDBCMD, lo que le permite personalizar la implementación para distintos entornos sin crear varias configuraciones de compilación. VSDBCMD proporciona funcionalidad de diferenciación, lo que significa que solo realizará los cambios necesarios para alinear una base de datos de destino con el esquema de la base de datos. VSDBCMD también ofrece una amplia gama de opciones de línea de comandos, que proporcionan un control específico sobre el proceso de implementación.

En esta introducción, puede ver que el uso de VSDBCMD con MSBuild es el enfoque más adecuado para un escenario de implementación empresarial típico:

Es compatible con Visual Studio 2010 Web Deploy 2.0 VSDBCMD.exe
¿Admite la implementación remota?
¿Admite actualizaciones incrementales? No
¿Admite scripts anteriores o posteriores a la implementación?
¿Admite la implementación en varios entornos? Limitado Limitado
¿Admite la implementación con scripts? Limitado

En el resto de este tema se describe el uso de VSDBCMD con MSBuild para implementar proyectos de base de datos.

Descripción del proceso de implementación

La utilidad VSDBCMD permite implementar una base de datos mediante el esquema de base de datos (el archivo .dbschema) o el manifiesto de implementación (el archivo .deploymanifest). En la práctica, casi siempre usará el manifiesto de implementación, ya que le permite proporcionar valores predeterminados para varias propiedades de implementación e identificar los scripts SQL anteriores o posteriores a la implementación que quiera ejecutar. Por ejemplo, este comando de VSDBCMD se usa para implementar la base de datos ContactManager en un servidor de bases de datos en un entorno de prueba:

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

En este caso:

  • El modificador /a (o /Action) especifica lo que quiere que haga VSDBCMD. Puede establecerlo en Importar o implementar. La opción Importar se usa para generar un archivo .dbschema a partir de una base de datos existente y la opción Implementar para implementar un archivo .dbschema en una base de datos de destino.
  • El modificador /manifest (o /ManifestFile) identifica el archivo .deploymanifest que se quiere implementar. Si en su lugar quisiera usar el archivo .dbschema, tendría que utilizar el modificador /model (o /ModelFile).
  • El modificador /cs (o /ConnectionString) proporciona la cadena de conexión para el servidor de base de datos de destino. Tenga en cuenta que esto no incluye el nombre de la base de datos: VSDBCMD debe conectarse al servidor para crear la base de datos; no es necesario conectarse a una base de datos individual. Si el archivo .deploymanifest incluye una cadena de conexión, puede omitir este modificador. Si usa el modificador de todos modos, el valor del modificador invalidará el valor .deploymanifest.
  • La propiedad /p:TargetDatabase proporciona el nombre que se quiere asignar a la base de datos de destino al crearla. Esto invalida el valor de la propiedad TargetDatabase en el archivo .deploymanifest. Puede usar la sintaxis /p:[nombre de propiedad] para establecer una amplia variedad de propiedades de implementación y invalidar las variables SQLCMD declaradas en el archivo .sqlcmdvars.
  • El modificador /dd+ (o /DeployToDatabase+) indica que quiere crear una implementación e implementarla en el entorno de destino. Si especifica /dd-, u omite el modificador, VSDBCMD generará un script de implementación, pero no lo implementará en el entorno de destino. Este modificador suele ser el origen de la confusión y se explica con más detalle en la sección siguiente.
  • El modificador /script (o /DeploymentScriptFile) especifica dónde se quiere generar el script de implementación. Este valor no afecta al proceso de implementación.

Para más información sobre VSDBCMD, vea Referencia de línea de comandos para VSDBCMD.EXE (implementación e importación de esquema) y Procedimiento: Preparación de una base de datos para la implementación desde un símbolo del sistema mediante VSDBCMD.EXE.

Para obtener un ejemplo de cómo puede usar VSDBCMD desde un archivo del proyecto de MSBuild, vea Descripción del proceso de compilación. Para obtener ejemplos de cómo configurar los valores de implementación de bases de datos para varios entornos, vea Personalización de implementaciones de base de datos para varios entornos.

Descripción del modificador DeployToDatabase

El comportamiento del modificador /dd o /DeployToDatabase depende de si usa VSDBCMD con un archivo .dbschema o un archivo .deploymanifest. Si usa un archivo .dbschema, el comportamiento es bastante sencillo:

  • Si especifica /dd+ o /dd, VSDBCMD generará un script de implementación e implementará la base de datos.
  • Si especifica /dd- u omite el modificador, VSDBCMD solo generará un script de implementación.

Si usa un archivo .deploymanifest, el comportamiento es mucho más complicado. Esto se debe a que el archivo .deploymanifest contiene un nombre de propiedad DeployToDatabase que también determina si se implementa la base de datos.

<DeployToDatabase>False</DeployToDatabase>

El valor de esta propiedad se establece según las propiedades del proyecto de base de datos. Si establece la acción Implementar en Crear un script de implementación (.sql), el valor será False. Si establece la acción Implementar en Crear un script de implementación (.sql) e implementar en la base de datos, el valor será True.

Nota:

Estos valores están asociados a una plataforma y una configuración de compilación específicas. Por ejemplo, si configura valores para la configuración Depuración y, después, realiza la publicación con la configuración Versión, no se usarán los valores.

For example, if you configure settings for the Debug configuration and then publish using the Release configuration, your settings will not be used.

Nota:

En este escenario, la acción Implementar siempre se debe establecer en Crear un script de implementación (.sql) porque no quiere que Visual Studio 2010 implemente la base de datos. Es decir, la propiedad DeployToDatabase siempre debe ser False.

Cuando se especifica una propiedad DeployToDatabase, el modificador /dd solo la invalidará si el valor de la propiedad es false:

  • Si la propiedad DeployToDatabase es Falsey especifica /dd+ o /dd, VSDBCMD invalidará la propiedad DeployToDatabase e implementará la base de datos.
  • Si la propiedad DeployToDatabase es False y especifica /dd- u omite el modificador, VSDBCMD no implementará la base de datos.
  • Si la propiedad DeployToDatabase es True, VSDBCMD omitirá el modificador e implementará la base de datos.
  • En cada caso, se genera un script de implementación, independientemente de si también va a implementar la base de datos.

Conclusión

En este tema se ha proporcionado información general sobre el proceso de compilación e implementación de proyectos de base de datos en Visual Studio 2010. También se ha descrito cómo puede usar VSDBCMD.exe con MSBuild para admitir la implementación de bases de datos a escala empresarial.

Para más información sobre cómo funciona en la práctica, vea Personalización de implementaciones de base de datos para varios entornos.

Lecturas adicionales

Para obtener información sobre cómo personalizar las implementaciones de base de datos mediante la creación de un archivo de configuración de implementación independiente para cada entorno, vea Personalización de implementaciones de base de datos para varios entornos. Para obtener instrucciones sobre cómo configurar las pertenencias a roles de base de datos mediante la ejecución de un script posterior a la implementación, vea Implementación de pertenencias a roles de base de datos en entornos de prueba. Para obtener instrucciones sobre cómo administrar algunos de los desafíos únicos que imponen las bases de datos de pertenencia, vea Implementación de bases de datos de pertenencia en entornos empresariales.

En estos temas de MSDN se proporcionan instrucciones más amplias e información general sobre proyectos de base de datos de Visual Studio y el proceso de implementación de la base de datos: