Partilhar via


Como depurar objetos de banco de dados CLR

Aplica-se a:SQL Server

SQL Server fornece suporte para a depuração de objetos Transact-SQL e CLR (common language runtime) na base de dados. Os principais aspetos da depuração no SQL Server são a facilidade de instalaçã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 em vários idiomas. Os usuários podem entrar perfeitamente em objetos CLR a partir do Transact-SQL e vice-versa.

O depurador de 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 usando os depuradores no Visual Studio. A depuração de objetos de bases de dados geridos no Visual Studio oferece suporte a todos os recursos comuns de depuração, como entrar em e passar por cima de instruções dentro de rotinas em execução 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.

Permissões e restrições de depuração

A depuração é uma operação altamente privilegiada e, portanto, apenas os membros da função de servidor fixo sysadmin estão autorizados a fazê-lo no SQL Server.

As seguintes restrições aplicam-se durante o debug:

  • A depuração de rotinas CLR é restrita a uma instância do depurador de cada vez. Esta limitação aplica-se porque toda a execução de código CLR congela quando um ponto de interrupção é atingido e a execução não continua até que o depurador avance desse ponto. No entanto, pode-se continuar a fazer a depuração do Transact-SQL em outras conexões. Embora Transact-SQL depuração não congele outras execuções no servidor, ela 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 o SQL Server requer informações sobre o ambiente do cliente e do depurador antes que a ligação possa ser estabelecida.

Portanto, recomendamos que o código Transact-SQL e CLR seja depurado em um servidor de teste e não em um servidor de produção.

Visão geral

A depuração no SQL Server segue um modelo por conexão. Um depurador pode detetar e depurar atividades somente na conexão do cliente à qual ele se conecta. Como a funcionalidade do depurador não é limitada pelo tipo de conexão, as conexões TDS (fluxo de dados tabulares) e HTTP podem ser depuradas. No entanto, o SQL Server não permite a depuração de conexões existentes. A depuração suporta todas as funcionalidades comuns de depuração em rotinas que são executadas no servidor. A interação entre um depurador e o SQL Server acontece por meio do COM (Component Object Model) distribuído.

Para obter mais informações e cenários sobre depuração de procedimentos armazenados gerenciados, funções, gatilhos, tipos definidos pelo usuário e agregações, consulte SQL Server CLR Integration Database Debugging na documentação do Visual Studio.

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

Passos de depuração

Use as seguintes etapas para depurar um objeto de banco de dados CLR no Microsoft Visual Studio:

  1. Abra o Microsoft Visual Studio e crie um novo projeto do SQL Server. Você pode usar a instância do SQL LocalDB que vem com o Visual Studio.

  2. Crie um novo tipo de CLR SQL (C#):

    1. No Gerenciador de Soluções , clique com o botão direito do mouse no projeto e selecione Adicionar, Novo Item....
    2. Na janela Adicionar Novo Item, selecione de Procedimento Armazenado SQL CLR C# , Função User-Defined SQL CLR C#, SQL CLR C# User-Defined Type, SQL CLR C# Trigger, SQL CLR C# Aggregateou Class.
    3. Especifique um nome para o arquivo de origem do novo tipo e selecione Adicionar.
  3. Adicione código para o novo tipo ao editor de texto. Para obter um código de exemplo de um procedimento armazenado, consulte a seguinte secção de exemplo neste artigo.

  4. Adicione um script que teste o tipo:

    1. No Gerenciador de Soluções , clique com o botão direito do mouse no nó do projeto e selecione Adicionar, Script....
    2. Na janela Adicionar Novo Item, selecione Script (Não na compilação)e especifique um nome, como Test.sql. Selecione o botão Adicionar.
    3. No Gerenciador de Soluções , clique duas vezes no nó Test.sql para abrir o arquivo de origem do script de teste padrão.
    4. Adicione o script de teste (um que invoca o código a ser depurado) ao editor de texto. Consulte o exemplo na próxima seção para obter um script de exemplo.
  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 na função ou rotina que você deseja depurar. Selecione Ponto de Interrupção, Inserir Ponto de Interrupção. O ponto de interrupção é adicionado, destacando a linha de código em vermelho.

  6. No menu " Depuração", selecione " Iniciar Depuração" para compilar, desenvolver e testar o projeto. O script de teste no Test.sql é executado e o objeto de banco de dados gerenciado é invocado.

  7. Quando a seta amarela (designando o ponteiro de instruções) aparece no ponto de interrupção, a execução de código é pausada. Em seguida, poderá depurar o seu objeto de base de dados gerida:

    1. Use Step Over do menu Debug para avançar o ponteiro de instruções para a próxima linha de código.
    2. Use a janela Locals para observar o estado dos objetos atualmente realçados pelo ponteiro de instrução.
    3. Adicione variáveis à janela de Observação . Você pode observar o estado das variáveis monitoradas durante toda a sessão de depuração, mesmo quando a variável não está na linha de código atualmente realçada pelo ponteiro de instrução.
    4. Selecione Continuar no menu de depuração para avançar o ponteiro de instruções para o próximo ponto de interrupção ou para concluir a execução da rotina se não houver mais pontos de interrupção.

Código de exemplo

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

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);
        }
    }
}

Exemplo de script de teste

O script de teste a seguir mostra como invocar o procedimento armazenado GetVersion definido no exemplo anterior.

EXECUTE GetVersion;