Cómo depurar objetos de base de datos CLR

Se aplica a: SQL Server

SQL Server ofrece compatibilidad con la depuración de objetos Transact-SQL y Common Language Runtime (CLR) de la base de datos. Los aspectos clave de la depuración en SQL Server son la facilidad de configuració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 pasar sin problemas a objetos de CLR desde Transact-SQL y viceversa. El depurador de Transact-SQL en SQL Server Management Studio no se puede utilizar para depurar objetos de base de datos administrados, pero se pueden depurar los objetos utilizando los depuradores de Visual Studio. La depuración de objetos de base de datos administrados en Visual Studio admite todas las funciones habituales de depuración, como las instrucciones "ir a" y "paso a paso por procedimientos" dentro de rutinas que se ejecutan en el servidor. Los depuradores pueden establecer puntos de interrupción, inspeccionar la pila de llamadas, inspeccionar variables y modificar valores de variables durante la depuración.

Nota:

Visual Studio .NET 2003 no puede utilizarse para programar o depurar la integración CLR. SQL Server incluye .NET Framework preinstalado y Visual Studio .NET 2003 no puede utilizar los ensamblados de .NET Framework 2.0.

Permisos y restricciones de depuración

La depuración es una operación altamente privilegiada, por lo que sólo los miembros del rol de servidor fijo sysadmin están autorizados a hacerlo 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 inmoviliza 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 Transact-SQL no inmoviliza otras ejecuciones en el servidor, puede provocar que otras conexiones esperen al mantener un bloqueo.

  • Las conexiones existentes no se pueden depurar; solo se pueden depurar las conexiones nuevas, ya que SQL Server requiere información sobre el cliente y el 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 prueba y no en un servidor de producción.

Información general

La depuración en SQL Server sigue un modelo por conexión. Un depurador solo puede detectar y depurar actividades en la conexión de cliente a la que está adjuntado. Dado que la funcionalidad del depurador no está limitada por el tipo de conexión, se pueden depurar flujos TDS y conexiones HTTP. Sin embargo, SQL Server no permite la depuración de conexiones existentes. La depuración admite todas las características habituales de depuración dentro de rutinas que se ejecutan en el servidor. La interacción entre un depurador y SQL Server se produce mediante un modelo de objetos componentes (COM) distribuido.

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

El protocolo de red TCP/IP debe habilitarse 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 cómo habilitar el protocolo TCP/IP en el servidor, vea Configurar protocolos de cliente.

Pasos de depuración

Siga estos pasos para depurar un objeto de base de datos CLR en Microsoft Visual Studio:

  1. Abra Microsoft Visual Studio y seleccione crear nuevo proyecto SQL Server. Puede usar la instancia de SQL LocalDB que viene con Visual Studio.

  2. Cree un nuevo tipo CLR de SQL (C#):

    1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Agregar, Nuevo artículo....
    2. En la ventana Añadir nuevo artículo, seleccione Procedimiento almacenado SQL CLR C#, Función definida por el usuario SQL CLR C#, Tipo definido por el usuario SQL CLR C#, Activador SQL CLR C#, Agregado SQL CLR C# o Clase.
    3. Especifique un nombre para el archivo de origen del nuevo tipo y, a continuación, seleccione Agregar.
  3. Agregue código para el nuevo tipo al editor de texto. Para ver el código de ejemplo de un procedimiento almacenado de ejemplo, consulte la sección Ejemplo de este artículo.

  4. Agregue un script que pruebe el tipo:

    1. En el Explorador de soluciones, haga clic con el botón derecho en el nodo del proyecto y seleccione Agregar, Script....
    2. En la ventana Agregar nuevo artículo, seleccione Script (No en compilación), y especifique un nombre, como Test.sql. Seleccione el botón Agregar.
    3. En el Explorador de soluciones, haga doble clic en el Test.sql nodo para abrir el archivo de origen del script de prueba predeterminado.
    4. Agregue el script de prueba (uno que invoque el código a depurar) al editor de texto. Consulte el ejemplo de la sección siguiente para ver 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 derecho en una línea de código en el editor de texto de la función o rutina que desea depurar. Seleccione Punto de interrupción, Insertar punto de interrupción. Se agrega el punto de interrupción, 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 ejecuta el script de prueba en Test.sql y se invoca al objeto de base de datos administrada.

  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 detiene. A continuación, puede depurar el objeto de base de datos administrado:

    1. Use Paso a paso en el menú Depurar para avanzar el puntero de instrucciones a la siguiente línea de código.
    2. Use la ventana Localización para observar el estado de los objetos actualmente resaltados por el puntero de instrucciones.
    3. Agregue variables a la ventana Inspección. Puede observar el estado de las variables inspeccionadas durante toda la sesión de depuración, incluso cuando la variable no se encuentre en la línea de código resaltada actualmente por el puntero de instrucciones.
    4. Seleccione Continuar en el menú Depurar para hacer avanzar el puntero de instrucción hasta el siguiente punto de interrupción o para completar la ejecución de la rutina si no hay más puntos de interrupción.

Ejemplo de código

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

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

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

Ejemplo de script de prueba

El siguiente script de prueba muestra cómo invocar el procedimiento almacenado GetVersion definido en el ejemplo anterior.

EXEC GetVersion  

Pasos siguientes

Para obtener más información acerca de cómo depurar con Visual Studio, vea Depuración de código administrado en la documentación de Visual Studio.

Para obtener más información, consulte Conceptos de programación de integración de Common Language Runtime