Este artículo describe cómo depurar (y sus ventajas) Procedimientos Almacenados, Funciones (UDF) y Desencadenadores (Triggers) en SQL Server 2005 (ejecución paso a paso, establecimiento de puntos de interrupción, examinar valores de las variables, etc.) con Visual Studio 2005. Debe tenerse en cuenta, que en SQL Server 2005 no es posible depurar Transact-SQL directamente desde SSMS (SQL Server Management Studio). Los conocimientos que aquí se detallan, también se aplica a SQL Server 2008 y Visual Studio 2008, aunque al final del presente artículo se detalla la depuración con SQL Server 2008 y SQL Server Management Studio (incluso recordamos la depuración con SQL Server 2000 y el Query Analyzer... que años aquellos... ;-).
¿Qué nos permite depurar un Procedimiento Almacenado en SQL Server con Visual Studio? ¿Para qué sirve? La depuración de un Procedimiento Almacenado en SQL Server con Visual Studio nos permite poder ejecutar paso a paso el código de dicho Procedimiento Almacenado (pulsando la tecla F10), o bien, establecer puntos de interrupción y ejecutar el código del Procedimiento Almacenado hasta alcanzar los puntos de interrupción establecidos (pulsando la tecla F5). Además, en ambos casos podremos examinar el contenido de las variables locales, globales y de sistema de SQL Server, a través de las ventanas Variables Locales (Locals) e Inspección (Watch) de Visual Studio 2005, así como podremos modificar el valor de una variable en tiempo de depuración. Algo básico durante el desarrollo y programación de SQL Server (Transact-SQL).
¿Qué permisos son necesarios para poder depurar código en SQL Server 2005 con Visual Studio 2005?
Para poder depurar código en SQL Server 2005 con Visual Studio 2005 es necesario utilizar un Inicio de Sesión miembro de sysadmin. Es indiferente que se trate de un Inicio de Sesión de Windows o de un Inicio de Sesión de SQL Server, siempre cuando el Inicio de Sesión sea miembro de sysadmin.
Si no cumplimos los permisos requeridos para la Depuración de SQL Server, e intentamos depurar código de SQL Server, podríamos obtener el siguiente error:
User 'dbo' could not execute stored procedure 'master.dbo.sp_enable_sql_debug' on SQL Server VSQL01. Click Help for more information.
En caso de tener instalado Visual Studio en español, el mensaje de error sería el siguiente:
El usuario 'dbo' no pudo ejecutar el procedimiento almacenado 'master.dbo.sp_enable_sql_debug' en SQL Server VSQL01.
El procedimiento almacenado sp_enable_sql_debug, es un procedimiento almacanado extendido del sistema, que en SQL Server 2005 y en SQL Server 2008 podremos encontrar bajo el esquema sys (es decir, master.sys.sp_enable_sql_debug).
Quizás, pueda parecer que los permisos o requisitos necesarios para poder depurar código en SQL Server, son demasiado elevados. Es importante tener en cuenta que la depuración de código SQL Server está diseñada para ser utilizada en instancias SQL Server locales o servidores SQL Server de desarrollo, y en consecuencia, no es recomendable utilizar la depuración de código SQL Server (SQL Server debugging) en entornos de producción.
¿Cómo depurar un Procedimiento Almacenado en SQL Server 2005 con Visual Studio 2005?
Para depurar un Procedimiento Almacenado en SQL Server 2005 con Visual Studio 2005, podemos utilizar la Depuración Directa de Base de Datos (Direct Database Debugging), lo cual consiste sencillamente en abrir la ventana Explorador de Servidores (Server Explorer) de Visual Studio 2005, agregar una nueva Conexión de Datos (Data Connections) a la instancia SQL Server deseada (si no existe una conexión creada anteriormente, claro), hacer click con el botón derecho sobre el Procedimiento Almacenado deseado, y en el menú contextual, seleccionar la opción Ir a Procedimiento Almacenado (Step into Procedure), pudiendo establecer los valores deseados de los parámetros del Procedimiento Almacenado (en caso de tener parámetros, claro) para la ejecución en modo depuración.
Llegados a este punto, tenemos dos opciones:
- Pulsar F5 (Continue - Continuar). Ejecutar hasta el siguiente punto de interrupción, o en su defecto hasta el final del Procedimiento Almacenado que se está depurando.
- Pulsar F10 (Step Over - paso a paso por el proceso actual). Ejecutar paso a paso, pulsando F10 para la ejecución de cada sentencia del Procedimiento Almacenado, sin profundizar. Es decir, si al ejecutar el Procedimiento Almacenado, salta un desencadenador (Trigger) o se invoca a otro Procedimiento Almacenado o Función (UDF), no se entrará a ejecutar paso a paso ni dicho Desencadenador (Trigger), ni dicho Procedimiento Almacenado ni dicha Función (UDF).
- Pulsar F11 (Step Into - paso a paso por instrucciones). Ejecutar paso a paso, pulsando F11 para la ejecución de cada sentencia del Procedimiento Almacenado, profundizando en objetos internos. Es decir, si al ejecutar el Procedimiento Almacenado, salta un desencadenador (Trigger) o se invoca a otro Procedimiento Almacenado o Función (UDF), se entrará a ejecutar paso a paso dicho Desencadenador (Trigger), Procedimiento Almacenado o Función (UDF).
- Pulsar Shift+F11 (Step Out - paso a paso para salir). Si utilizamos F11 (Step Into) para ejecutar paso a paso objetos "internos", podemos utilizar Shift+F11 (Step Out) para salir de la depuración de dichos objetos internos y continuar la depuración paso a paso del objeto principal.
En todo momento, podremos evaluar el valor de variables locales, para lo cual podemos utilizar la ventana Variables Locales (Locals) de Visual Studio 2005, disponible desde Depurar -> Ventanas -> Variables Locales (Debug -> Windows -> Locals). Del mismo modo, podremos evaluar otras variables, como las variables del sistema, desde la ventana Inspección (Watch) de Visual Studio 2005, teniendo en cuenta que en la ventana Inspección (Watch), también podemos evaluar las variables locales, y además, para evaluar variables del sistema (ej: @SERVERNAME, @@ERROR, etc.) será necesario añadirlas a la ventana Inspección (Watch). Resulta de gran interés el hecho de poder modificar el valor de las variables en tiempo de depuración, para lo cual, deberemos utilizar las ventanas Variables Locales (Locals) o Inspección (Watch) de Visual Studio 2005 para modificar el valor de las variables deseadas. A continuación se muestra una pantalla capturada de Visual Studio 2005 for Database Professional (DBPro), depurando un Procedimiento Almacenado en SQL Server 2005 (ojo, que el menu Debug es un pelín diferente al de Visual Studio 2005 Professional, aunque se pueda hacer lo mismo: F10, F11, Shift+F11, etc.).
Es importante tener en cuenta que al realizar Depuración Directa de Base de Datos (Direct Database Debugging), si el Procedimiento Almacenado que se está depurando utiliza algún otro Procedimiento Almacenado, Función (UDF) o Desencadenador (Trigger), al ejecutar paso a paso el Procedimiento Almacenado no se accederá a la ejecución paso a paso (depuración) de dicho Procedimiento Almacenado, Función y/o Desencadenador (Trigger), excepto que establezcamos un punto de interrupción en la Función (UDF) y/o Desencadenador (Trigger) deseado, o excepto que utilicemos la opción Step Into (F11).
¿Cómo establecer un Punto de Interrupción con Visual Studio 2005 en un Procedimiento Almacenado, Función (UDF) o Desencadenador (Trigger) de SQL Server? Pues muy fácil, tan sólo es necesario abrir el objeto deseado (Procedimiento, Función ó Trigger) desde la ventana Explorador de Servidores de Visual Studio 2005, y establecer el Punto de Interrupción en el lugar deseado, ya sea desde el menú contextual (click con el botón derecho en la línea de código deseada, y después, utilizar el submenú Punto de Interrupción – Break Point – del menú contextual), o bien haciendo click en el margen izquierdo en la línea deseada de la ventana de código (se pondrá una bola roja en el margen al crear el Punto de Interrupción). En cualquier caso, se debe establecer los puntos de interrupción antes de empezar a depurar, pues una vez iniciada la depuración o ejecución paso a paso no será posible incluir nuevos puntos de interrupción (bueno... si será posible pero sólo en el objeto que estamos depurando).
¿Cómo depurar un Desencadenador (Trigger) en SQL Server 2005 con Visual Studio 2005?
Para depurar un Desencadenador (Trigger) en SQL Server 2005 con Visual Studio 2005, podemos utilizar la Depuración Directa de Base de Datos (Direct Database Debugging), del mismo modo que hicimos en el caso anterior (depuración de Procedimientos Almacenados en SQL Server 2005). Sin embargo, debemos tener en cuenta que a un Desencadenador (Trigger) no se le puede invocar directamente, por lo cual, lo que podemos hacer es crear un Procedimiento Almacenado cuyo código fuente invoque al Desencadenador (Trigger) que se desea depurar (o bien, utilizar un Procedimiento Almacenado existente que también genere la ejecución del Desencadenador), de tal modo, que deberemos establecer un punto de interrupción en el código del Desencadenador (Trigger) e iniciar la depuración de un Procedimiento Almacenado que ejecute el Desencadenador (Trigger) deseado (el truco del almendruco ;-). Otra opción, es utilizar Step Into (F11 - paso a paso por instrucciones) en vez de Step Over (F10 - paso a paso por el proceso actual) para la depuración de dicho Procedimiento Almacenado, y así conseguir iniciar la depuración del Desencadendor (Trigger) deseado. Con cualquiera de estos dos métodos, habremos conseguido nuestro objetivo.
¿Cómo depurar una Función Definida por el Usuario (UDF: User Defined Function) en SQL Server 2005 con Visual Studio 2005?
Para depurar una Función Definida por el Usuario (UDF: User Defined Function) en SQL Server 2005 con Visual Studio 2005, podemos utilizar la Depuración Directa de Base de Datos (Direct Database Debugging), lo cual consiste sencillamente en abrir la ventana Explorador de Servidores (Server Explorer) de Visual Studio 2005, agregar una nueva Conexión de Datos (Data Connections) a la instancia SQL Server deseada (si no existe una conexión creada anteriormente, claro), hacer click con el botón derecho sobre la Función deseada, y en el menú contextual, seleccionar la opción Ir a Función (Step into Function), pudiendo establecer los valores deseados de los parámetros de la Función (en caso de tener parámetros, claro) para la ejecución en modo depuración. Llegados a este punto, tenemos dos opciones:
- Pulsar F5 (Continue - Continuar). Ejecutar hasta el siguiente punto de interrupción, o en su defecto hasta el final de la Función (UDF) que se está depurando.
- Pulsar F10 (Step Over - paso a paso por el proceso actual). Ejecutar paso a paso, pulsando F10 para la ejecución de cada sentencia de la Función (UDF) que se está depurando, sin profundizar. Es decir, si al ejecutar la Función (UDF), se invoca a otra Función (UDF), no se entrará a ejecutar paso a paso dicha Función (UDF) "interna".
- Pulsar F11 (Step Into - paso a paso por instrucciones). Ejecutar paso a paso, pulsando F11 para la ejecución de cada sentencia de la Función (UDF) que se está depurando, profundizando en objetos internos. Es decir, si al ejecutar la Función (UDF), se invoca a otra Función (UDF), se entrará a ejecutar paso a paso dicha Función (UDF) "interna".
- Pulsar Shift+F11 (Step Out - paso a paso para salir). Si utilizamos F11 (Step Into) para ejecutar paso a paso objetos "internos", podemos utilizar Shift+F11 (Step Out) para salir de la depuración de dichos objetos internos y continuar la depuración paso a paso del objeto principal.
En todo momento, podremos evaluar el valor de variables locales, para lo cual podemos utilizar la ventana Variables Locales (Locals) de Visual Studio 2005, disponible desde Depurar -> Ventanas -> Variables Locales (Debug -> Windows -> Locals). Del mismo modo, podremos evaluar otras variables, como las variables del sistema, desde la ventana Inspección (Watch) de Visual Studio 2005, teniendo en cuenta que en la ventana Inspección (Watch), también podemos evaluar las variables locales, y además, para evaluar variables del sistema (ej: @SERVERNAME, @@ERROR, etc.) será necesario añadirlas a la ventana Inspección (Watch). Resulta de gran interés el hecho de poder modificar el valor de las variables en tiempo de depuración, para lo cual, deberemos utilizar las ventanas Variables Locales (Locals) o Inspección (Watch) de Visual Studio 2005 para modificar el valor de las variables deseadas.
Del mismo modo que cuando hablamos de la depuración de Procedimientos Almacenados, si desde una Función (UDF) accedemos a otros objetos de base de datos que deseemos depurar (ej: funciones anidadas que deseemos ejecutar paso a paso), podremos establecer puntos de interrupción en dichos objetos, para así poder depurarlos, o bien utilizar Step Into (F11 - paso a paso por instrucciones) en vez de Step Over (F10 - paso a paso por el proceso actual) para la depurar. Recordar, como ya comentamos, que deberemos agregar los puntos de interrupción antes de empezar a depurar.
¿Cómo depurar con SQL Server 2008 y Visual Studio 2008?
Todo lo comentado anteriormente para depurar SQL Server 2005 con Visual Studio 2005, se aplica también para depurar SQL Server 2008 con Visual Studio 2008. Sin embargo, se incorporan alguna nueva funcionalidad.
Quizás la más importante, es que con SQL Server 2008 se puede depurar desde SQL Server Management Studio (SSMS), directamente, sin necesidad de utilizar Visual Studio (joder, que gusto ;-). Esta es una gran mejora, que muchos esperábamos y deseabamos desde la ansia, y que por fin tenemos. Bueno... recuerdo que con SQL Server 2000 se podía depurar directamente desde la herramienta Query Analyzer (T-SQL Debugger), como se muestra en la siguiente imagen:
De hecho, al depurar con SQL Server 2000, también podíamos ejecutar código paso a paso, pues teníamos las opciones Step Into (F11), Step Over (F10), Step Out (Shift+F11) y Continue directamente desde Query Analyzer. Por supuesto, al depurar con SQL Server 2000 también podíamos establecer Puntos de Interrupción (Break Points), examinar los valores de las variables, modificar los valores de las variables en tiempo de depuración, etc. A continuación se muestra un pantallazo de un servidor virtual SQL Server 2000 Developer del Laboratorio de GuilleSQL, donde se representan dichas funcionalidades de Query Analyzer y de depuración de SQL Server 2000.
Ahora, con SQL Server 2008 podemos depurar código T-SQL desde SQL Server Management Studio (como se hacía antaño ;-), aunque también es cierto que existe alguna pequeña diferencia. La primera diferencia salta a la vista, y se trata del nuevo menú Debug incluido en SQL Server Management Studio (SSMS). A través de este menú, y directamente desde una ventana de consulta de SQL Server Management Studio, podremos iniciar la depuración, como se muestra en la siguiente pantalla capturada del Laboratorio de GuilleSQL.
Esto es en sí, una gran novedad, ya que implica que ahora con SQL Server 2008 podemos depurar directamente un Batch de Transact-SQL (T-SQL). Con esto, lo que quiero decir, es que antes sólo podíamos depurar objetos de SQL Server, como por ejemplo, depurar un procedimiento almacenado (caso típico). Ahora, podemos tener un trozo cualquiera de código Transact-SQL, quizás de algún Script que ejecutamos periódicamente en nuestro día a día, e iniciar la depuración de dicho trozo de código Transact-SQL. No es necesario crear un Procedimiento Almacenado, para poder depurar dicho código, como teníamos que hacer antes para salir del apuro...
Así, una vez iniciada la depuración del Batch, podemos utilizar las opciones del menú Debug de SQL Server 2008 para depurar nuestro código Transact-SQL, e incluso depurar nuestros objetos de SQL Server, es decir, utilizar las opciones Step Into (F11), Step Over (F10), Step Out (Shift+F11) y Continue, así como utilizar Puntos de Interrupción, etc.
La verdad que la mejora es de agradecer, ya que aquí han tenido un gran detalle los señores de Microsoft del equipo de producto de SQL Server 2008 (mi más sinceras gracias).
Y poco más que contar de momento. Como siempre, espero que el contenido del artículo os guste ;-)