Share via


Depurando objetos de banco de dados CLR

O SQL Server oferece suporte para depurar o Transact-SQL e objetos do CLR (Common Language Runtime) no banco de dados. Os principais aspectos da depuração no SQL Server são a facilidade de configuração e uso, e a integração do depurador do SQL Server com o depurador do Microsoft Visual Studio. Além disso, a depuração funciona entre idiomas. Os usuários podem entrar diretamente em objetos CLR do Transact-SQL e vice-versa. O depurador Transact-SQL do SQL Server no SQL Server Management Studio não pode ser usado para depurar objetos de banco de dados gerenciados, mas você pode depurar os objetos através dos depuradores no Visual Studio. A depuração de objetos de banco de dados gerenciados no Visual Studio oferece suporte a todos os recursos de depuração comuns, tais como as instruções de "depuração parcial" e "depuração completa" dentro de rotinas executadas no servidor. Os depuradores podem definir pontos de interrupção, inspecionar a pilha de chamadas, inspecionar variáveis e modificar valores de variáveis durante a depuração. Observe que o Visual Studio .NET 2003 não pode ser usado na programação de integração ou depuração do CLR. O SQL Server inclui o .NET Framework pré-instalado, e o Visual Studio .NET 2003 não pode usar os assemblies do .NET Framework 2.0.

Para obter mais informações sobre como depurar código gerenciado usando o Visual Studio, consulte o tópico "Depuração do código gerenciado" na documentação do Visual Studio.

Depurando permissões e restrições

A depuração é uma operação altamente privilegiada; portanto, apenas membros da função de servidor fixa sysadmin têm permissão para fazer isso no SQL Server.

As seguintes restrições se aplicam durante a depuração:

  • A depuração de rotinas de CLR é restrita a uma instância de depurador de cada vez. Essa limitação se aplica pois a execução do código de CLR inteira fica congelada quando um ponto de interrupção é atingido; a execução só prossegue quando o depurador sai do ponto de interrupção. Porém, você pode continuar depurando o Transact-SQL em outras conexões. Embora a depuração do Transact-SQL não congele outras execuções no servidor, ela pode colocar outras conexões em espera quando mantém um bloqueio.

  • As conexões existentes não podem ser depuradas, apenas as conexões novas, pois o SQL Server requer informações sobre o cliente e o ambiente do depurador para poder fazer a conexão.

Devido às restrições anteriores, recomendamos que o Transact-SQL e o código CLR sejam depurados em um servidor de teste, e não em um servidor de produção.

Visão geral da depuração de objetos de banco de dados gerenciados

A depuração no SQL Server segue um modelo por conexão. Um depurador só pode detectar e depurar atividades para a conexão do cliente à qual ele está anexado. Como a funcionalidade do depurador não é limitada pelo tipo de conexão, pode-se depurar conexões do protocolo TDS e HTTP. Porém, o SQL Server não permite a depuração de conexões existentes. A depuração oferece suporte a todos os recursos de depuração comuns dentro de rotinas executadas no servidor. A interação entre um depurador e o SQL Server ocorre através do COM (Component Object Model) distribuído.

Para obter mais informações e cenários sobre a depuração de procedimentos armazenados gerenciados, funções, gatilhos, tipos definidos pelo usuário e agregações, consulte o tópico "Depuração de banco de dados de integração CLR do SQL Server" na documentação do Visual Studio.

O protocolo de rede TCP/IP deve estar habilitado na instância do SQL Server para permitir o uso do Visual Studio no desenvolvimento remoto, na depuração e no desenvolvimento. Para obter mais informações sobre como habilitar o protocolo TCP/IP no servidor, consulte Configurando protocolos de rede de cliente.

Para depurar um objeto de banco de dados gerenciado

  1. Abra o Microsoft Visual Studio, crie um novo projeto do SQL Server e estabeleça uma conexão com um banco de dados em uma instância do SQL Server.

  2. Crie um tipo novo. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto, selecione Adicionar e Novo Item… na janela Adicionar Novo Item, selecione Procedimento Armazenado, Função Definida pelo Usuário, Tipo Definido pelo Usuário, Gatilho, Agregado ou Classe. Especifique um nome para o arquivo de origem do tipo novo e clique em Adicionar.

  3. Adicione código para o tipo novo no editor de texto. Para obter um código de exemplo de um procedimento armazenado de exemplo, consulte a seção correspondente mais adiante nesse tópico.

  4. Adicione um script que testa o tipo. No Gerenciador de Soluções, expanda o diretório TestScripts e clique duas vezes em Test.sql para abrir o arquivo de origem do script de teste padrão. Adicione o script de teste, aquele que invoca o código a ser depurado, no editor de texto. Veja um script de exemplo a seguir.

  5. Coloque um ou mais pontos de interrupção no código fonte. Clique com o botão direito do mouse em uma linha de código no editor de texto, dentro da função ou rotina a ser depurada, e selecione Ponto de Interrupção e Inserir Ponto de Interrupção. O ponto de interrupção é adicionado, destacando a linha de código em vermelho.

  6. No menu Depurar, selecione Iniciar Depuração para compilar, implantar e testar o projeto. O script de teste em Test.sql será executado e o objeto de banco de dados gerenciado será invocado.

  7. Quando a seta amarela que designa o ponteiro de instrução aparece no ponto de interrupção, há uma pausa na execução do código e você pode começar a depurar seu objeto de banco de dados gerenciado. Você pode Executar Próxima no menu Depurar para avançar o ponteiro de instrução até a próxima linha de código. A janela Locais é usada para observar o estado dos objetos destacados no momento pelo ponteiro de instrução. É possível adicionar variáveis à janela Inspecionar. O estado de variáveis inspecionadas pode ser observado na sessão de depuração inteira, e não apenas quando a variável está na linha de código destacada no momento pelo ponteiro de instrução. Selecione Continuar no menu Depurar para avançar o ponteiro de instrução até o próximo ponto de interrupção ou para concluir a execução da rotina se não houver mais pontos de interrupção.

Exemplo

O exemplo a seguir retorna a versão do SQL Server para o chamador.

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

O script de teste a seguir invoca o procedimento armazenado GetVersion, definido anteriormente.

EXEC GetVersion