Depurar objetos de bases de datos CLR

SQL Server proporciona la compatibilidad para depurar objetos de Common Language Runtime (CLR) y Transact-SQL en la base de datos. Los aspectos clave de la depuración en SQL Server son la facilidad de instalación y uso, y la integración del depurador de SQL Server con el depurador de Microsoft Visual Studio. Además, la depuración se produce en todos los lenguajes. Los usuarios pueden acceder a los objetos CLR desde Transact-SQLy viceversa. El depurador SQL Server 2008 Transact-SQL en SQL Server Management Studio no se puede utilizar para depurar objetos administrados de la base de datos, pero puede depurar los objetos utilizando los depuradores en Visual Studio 2005 Professional Edition y de Visual Studio 2005 Team Suite Edition. La depuración de objetos de bases de datos administrados en Visual Studio admite todas las funciones habituales de depuración, como "paso a paso por instrucciones" y "paso a paso por procedimientos" las instrucciones dentro de las rutinas que ejecutan en el servidor. Los depuradores pueden establecer puntos de interrupción, inspeccionar la pila de llamadas, inspeccionar las variables y modificar los valores de las variables durante la depuración. Tenga en cuenta que Visual Studio .NET 2003 no puede utilizarse para la programación o depuración de integración de CLR. SQL Server incluye .NET Framework preinstalado y Visual Studio .NET 2003 no puede utilizar los ensamblados de .NET Framework 2.0.

Para obtener más información sobre la depuración de código administrado con Visual Studio, vea el tema "Depurar código administrado" en la documentación de Visual Studio.

Depuración de permisos y restricciones

La depuración es una operación que necesita muchos privilegios y por consiguiente sólo los miembros de la función de servidor fija sysadmin tienen permiso para realizarla en SQL Server.

Las restricciones siguientes se aplican durante la depuración:

  • La depuración de rutinas CLR está restringida a una instancia del depurador cada vez. Esta limitación se aplica porque toda la ejecución de código de CLR se detiene cuando se alcanza un punto de interrupción y la ejecución no continúa hasta que el depurador pasa el punto de interrupción. Sin embargo, puede seguir depurando Transact-SQL en otras conexiones. Aunque la depuración de Transact-SQL no pausa otras ejecuciones en el servidor, podría hacer que otras conexiones esperen mediante un bloqueo.

  • No se pueden depurar las conexiones existentes, sólo las nuevas conexiones, ya que SQL Server requiere información sobre el cliente y entorno del depurador antes de que se pueda realizar la conexión.

Debido a las restricciones anteriores, se recomienda que el código Transact-SQL y CLR se depure en un servidor de pruebas y no en un servidor de producción.

Información general de la depuración de objetos de base de datos administrados

La depuración en SQL Server sigue un modelo por conexión. Un depurador puede detectar y depurar las actividades únicamente en la conexión de cliente a la que está asociado. Dado que el tipo de conexión no limita la funcionalidad del depurador, se pueden depurar secuencias de datos tabulares (TDS) y conexiones HTTP. Sin embargo, SQL Server no permite la depuración de las conexiones existentes. La depuración admite todas las funciones habituales de depuración dentro de las rutinas que se ejecutan en el servidor. La interacción entre un depurador y SQL Server se produce mediante un Modelo de componente de objeto (COM) distribuido.

Para obtener más información y escenarios sobre la depuración de procedimientos almacenados, funciones, desencadenadores, tipos definidos por el usuario y agregados administrados, vea el tema "Depuración de bases de datos de integración de SQL Server CLR" en la documentación de Visual Studio.

[!NOTA]

El protocolo de red TCP/IP debe estar habilitado en la instancia de SQL Server a fin de utilizar Visual Studio para el desarrollo remoto, la depuración y el desarrollo. Para obtener más información sobre la forma de habilitar el protocolo TCP/IP en el servidor, vea Configurar protocolos de red de cliente.

Para depurar un objeto de base de datos administrado

  1. Abra Microsoft Visual Studio 2005, cree un nuevo proyecto SQL Server y establezca una conexión a una base de datos en una instancia de SQL Server.

  2. Cree un nuevo tipo. En Explorador de soluciones, haga clic con el botón secundario en el proyecto, seleccione Agregar y Nuevo elemento... En la ventana Agregar nuevo elemento, seleccione Procedimiento almacenado, Función definida por el usuario, Tipo definido por el usuario, Desencadenador, Agregado o Clase. Especifique un nombre para el archivo de origen del nuevo tipo y haga clic en Agregar.

  3. Agregue el código del nuevo tipo al editor de texto. Para ver el código de ejemplo de un procedimiento almacenado de ejemplo, vea la sección posterior de este tema.

  4. Agregue un script que pruebe el tipo. En Explorador de soluciones, expanda el directorio TestScripts, haga doble clic en Test.sql para abrir el archivo de código fuente del script de prueba predeterminado. Agregue el script de prueba, uno que invoque el código que se va a depurar, al editor de texto. A continuación se muestra un script de ejemplo.

  5. Coloque uno o más puntos de interrupción en el código fuente. Haga clic con el botón secundario del mouse en una línea de código en el editor de texto, dentro de la función o rutina que desea depurar y seleccione Punto de interrupción e Insertar punto de interrupción. El punto de interrupción se agrega, resaltando la línea de código en rojo.

  6. En el menú Depurar, seleccione Iniciar depuración para compilar, implementar y probar el proyecto. Se ejecutará el script de prueba en Test.sql y se invocará el objeto de la base de datos administrado.

  7. Cuando la flecha amarilla que designa el puntero de instrucción aparece en el punto de interrupción, la ejecución del código se pausa y puede empezar a depurar el objeto de base de datos administrado. Puede ir paso a paso sobre procedimientos desde el menú Depurar para avanzar el puntero de instrucción a la siguiente línea de código. La ventana Variables locales se utiliza para observar el estado de los objetos actualmente resaltado por el puntero de instrucción. Se pueden agregar variables a la ventana de inspección. El estado de las variables observadas se puede observar en toda la sesión de depuración, no sólo cuando la variable está en la línea de código actualmente resaltado por el puntero de instrucción. Seleccione Continuar en el menú Depurar para avanzar el puntero de instrucción al siguiente punto de interrupción o para completar la ejecución de la rutina si no hay más puntos de interrupción.

Ejemplo

En el ejemplo siguiente se devuelve la versión de SQL Server al autor de las llamadas.

C#

using System;
using System.Data;
using System.Data.SqlTypes;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server; 

public class StoredProcedures 
{
   [Microsoft.SqlServer.Server.SqlProcedure]
   public static void GetVersion()
   {
   using(SqlConnection connection = new SqlConnection("context connection=true")) 
   {
      connection.Open();
      SqlCommand command = new SqlCommand("select @@version",
                                           connection);
      SqlContext.Pipe.ExecuteAndSend(command);
      }
   }
}

Visual Basic

Imports System
Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Imports System.Data.SqlClient

Partial Public Class StoredProcedures 
    <Microsoft.SqlServer.Server.SqlProcedure> _
    Public Shared Sub GetVersion()
        Using connection As New SqlConnection("context connection=true")
            connection.Open()
            Dim command As New SqlCommand("SELECT @@VERSION", connection)
            SqlContext.Pipe.ExecuteAndSend(command)
        End Using
    End Sub
End Class

El siguiente es un script de prueba que invoca el procedimiento almacenado GetVersion definido anteriormente.

EXEC GetVersion