Compartilhar via


Depurando objetos de banco de dados CLR

SQL Server fornece suporte para depuração de objetos Transact-SQL e CLR (Common Language Runtime) no banco de dados. Os principais aspectos da depuração em SQL Server são a facilidade de instalação e uso e a integração do depurador SQL Server com o depurador do Microsoft Visual Studio. Além disso, a depuração funciona entre idiomas. Os usuários podem intervir perfeitamente em objetos CLR do Transact-SQL e vice-versa. O depurador Transact-SQL no SQL Server Management Studio não pode ser usado para depurar objetos de banco de dados gerenciados, mas você pode depurar os objetos por meio dos depuradores do 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 na depuração do CLR. SQL Server inclui o .NET Framework pré-instalado e o Visual Studio .NET 2003 não pode usar os assemblies .NET Framework 2.0.

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

Depurando permissões e restrições

A depuração é uma operação altamente privilegiada e, portanto, somente membros da função de servidor fixa sysadmin têm permissão para fazer isso em 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. No entanto, 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, isso pode fazer com que outras conexões aguardem mantendo um bloqueio.

  • As conexões existentes não podem ser depuradas, apenas novas conexões, pois SQL Server requer informações sobre o ambiente do cliente e do depurador antes que a conexão possa ser feita.

Devido às restrições acima, recomendamos que o código Transact-SQL e 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 em 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. No entanto, 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 SQL Server ocorre por meio do COM (Component Object Model) distribuído.

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

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

Para depurar um objeto de banco de dados gerenciado

  1. Abra o Microsoft Visual Studio, crie um novo projeto 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. Em 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, Agregação ou Classe. Especifique um nome para o arquivo de origem do novo tipo 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. Em Gerenciador de Soluções, expanda o diretório TestScripts 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 que você deseja depurar 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 Percorrer no menu Depurar para avançar o ponteiro de instrução para a próxima linha de código. A janela Locais é usada para observar o estado dos objetos realçados atualmente pelo ponteiro de instrução. Variáveis podem ser adicionadas à janela Inspeção . 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 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  

Consulte Também

Conceitos de programação da Integração CLR (Common Language Runtime)