viernes, 23 de octubre de 2009

Ejecutar una rutina T-SQL en los eventos Pre-Build y Post-Build en Visual Studio 2008

En la entrada anterior expuse una rutina para obtener la información de los respaldos de una base de datos de Microsoft SQL Server para generar una rutina que restaurara el respaldo. El objetivo es integrar la rutina en el proceso de construcción de la solución/proyecto en Visual Studio 2008. En esta ocasión voy a utilizar los eventos "Pre-Build" y "Post-Build" para generar la rutina de restauración y ejecutarla para obtener una copia fresca de los datos antes de que se ejecute el despliegue (Deploy) de un proyecto de base de datos.

Entorno

Para poner en práctica esta idea, vamos a utilizar:
  • Visual Studio 2008 Team System Database Edition GDR R2
  • Microsoft SQL Server Express 2005

Los eventos Pre-Build y Post-Build

Visual Studio nos ofrece una manera fácil y rápida de ejecutar un comando previo a la construcción de un proyecto y otro después de la construcción. Para ver/modificar los comandos debemos acceder a la pestaña "Eventos de Construcción" (Build Events) en la ventana de Atributos del Proyecto (Project Properties):
[Insertar Imagen]
En los campos para la línea de comando de los eventos podemos escribir comandos que se ejecutarán en la línea de comandos de Windows, con la característica de que tenemos acceso a ciertas macros que nos permiten incrustar los valores de algunos atributos del proyecto en el texto del comando que se ejecuta:

sqlcmd

Antes de la interfaz gráfica existía el nirvana de la línea de comandos. Una simple interfaz que nos permite automatizar diversas tareas. Digamos que es el lenguaje natural de programación que nos ofrece el sistema operativo.
Cuando instalamos SQL Server Express, tenemos la opción de instalar las herramientas de administración y línea de comandos. Para el mortal promedio, estos programas adicionales no son de mucha utilidad, sin embargo para el verdadero programador son como una caja llena de bloques Lego(tm). Uno de esos bloques es: sqlcmd.exe, un programa que nos permite:
  • Conectarnos a un servidor SQL Server —valga la redundancia— y enviarle comandos de manera interactiva o,
  • lo que nos interesa, especificando un archivo de entrada a través del modificador -i
  • Además, podemos utilizar variables en el código del archivo y especificar su valor al momento de ejecución a través del modificador -v

Ejecución condicional en la línea de comandos

A pesar de que el intérprete de comandos de Windows está muy limitado en comparación con Bash, nos permite condicionar la ejecución de un comando utilizando la directiva if que tiene variantes para evaluar expresiones booleanas que comparen cadenas de caracteres, determinar la existencia de un archivo, entre otras.
Si creen que necesitan un intérprete más rico en expresiones y comandos, pueden utilizar Windows Scripting Host para ejecutar rutinas escritas en VBScript o JScript. Otra alternativa más reciente y que exploraré próximamente es PowerShell

El comando para generar la rutina de restauración

Recordando los viejos tiempos de DOS e inspirado por las rutinas de Bash tan socorridas en Linux, escribí el siguiente comando para ejecutar mi rutina de T-SQL para generar el código para restaurar la base de datos en mi ambiente de desarrollo (ajusté el formato para mayor claridad, pero en realidad va en una sola línea):

if "$(Configuration)" == "Debug" (
  if "$(DeployToDatabase)" == "True" (
    sqlcmd -U sa -P contraseñaSA -S nombre.host.servidor,puerto
      -v ProductionDatabaseName="BaseDeDatosProduccion"
      -v DatabaseName="$(FinalTargetDatabase)"
      -v RestorePath="X:\Ruta\Restauracion"
      -i "$(SolutionDir)Ruta\A\Rutina\GenerarRutinaRestauracion.sql"
      -o "$(SolutionDir)NombreProyecto\$(OutputPath)Restaurar.sql"
  )
)
Básicamente el comando anterior se traduce a:
  • Si la configuración del proyecto es igual a "Debug", entonces:
    • Si está marcada la opción "Deploy to Database", entonces:
      • Utilizar sqlcmd para ejecutar la rutina que genera la rutina de restauración, utilizando los parámetros indicados


El comando para ejecutar la rutina de restauración

El comando para ejecutar la rutina que se generó en el event Pre-build es el siguiente:

if "$(Configuration)" == "Debug" (
  if "$(DeployToDatabase)" == "True" (
    if exist $(SolutionDir)NombreProyecto\$(OutputPath)Restaurar.sql (
      sqlcmd -U sa -P contraseñaSA -S nombre.host.servidor,puerto
        -v DatabaseName="$(FinalTargetDatabase)"
        -i $(SolutionDir)NombreProyecto\$(OutputPath)Restaurar.sql
    )
  )
)
Como ven es muy similar, les dejo de tarea su interpretación.

Conclusión

Visual Studio nos permite integrar acciones de manera fácil y rápida al proceso de construcción de una solución. Con un poco de ingenio podemos mejorar nuestra eficiencia al dejar que las tareas tediosas y repetitivas de nuestro proceso de desarrollo sean ejecutadas por la misma herramienta de construcción.
En algún momento en el futuro, exploraré más a detalle el proceso de construcción de Visual Studio. Tengo curiosidad por conocer el proceso de construcción más a fondo y poder extenderlo más allá de los simples eventos. Por lo pronto esta solución simple funciona y me ha permitido tener más tiempo disponible (mientras espero a que se complete el proceso de construcción de Visual Studio) para poder publicar esta entrada.

No hay comentarios:

Publicar un comentario