Como depurar objetos de banco de dados CLR
Aplica-se a:SQL Server
O Microsoft SQL Server fornece suporte para depurar objetos Transact-SQL e 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 Transact-SQL depurador 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 objeto de banco de dados gerenciado no Visual Studio dá suporte a todos os recursos comuns de depuração, como instruçõesintervir e passo a passo em 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 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ó avança 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 Transact-SQL não congele outras execuções no servidor, ela pode fazer com que outras conexões esperem mantendo um bloqueio ativo.
Conexões existentes não podem ser depuradas, apenas novas conexões, pois o SQL Server precisa de informações sobre o ambiente do cliente e do depurador antes que a conexão possa ser estabelecida.
Recomendamos, portanto, que Transact-SQL e código CLR sejam depurados 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 detectar e depurar atividades somente na conexão do cliente à qual ele se anexa. Como a funcionalidade do depurador não é limitada pelo tipo de conexão, as conexões TDS (fluxo de dados de tabela) e HTTP podem ser depuradas. No entanto, o SQL Server não permite o debug 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 depuração de procedimentos armazenados gerenciados, funções, gatilhos, tipos definidos pelo usuário e agregações, consulte Depuração de banco de dados com a integração do CLR no SQL Server na documentação do Visual Studio.
O protocolo de rede TCP/IP deve estar habilitado na instância do SQL Server para que o Visual Studio seja usado no desenvolvimento remoto, na depuração e no desenvolvimento. Para obter mais informações sobre como habilitar o protocolo TCP/IP no servidor, consulte Configurar protocolos de cliente.
Etapas de depuração
Use as etapas a seguir para depurar um objeto de banco de dados CLR no Microsoft Visual Studio:
Abra o Microsoft Visual Studio e crie um projeto do SQL Server. Você pode usar a instância SQL LocalDB que vem com o Visual Studio.
Crie um novo tipo de SQL CLR (C#):
- No Gerenciador de Soluções, clique com o botão direito do mouse no projeto e selecione Adicionar, Novo Item....
- Na janela Adicionar Novo Item, selecione Procedimento Armazenado SQL CLR C#, Função Definida pelo Usuário SQL CLR C#, Tipo Definido pelo Usuário SQL CLR C#, Gatilho SQL CLR C#, Agregado SQL CLR C# ou Classe.
- Especifique um nome para o arquivo de origem do novo tipo e, em seguida, selecione Adicionar.
Adicione código para o tipo novo no editor de texto. Para ver o código de exemplo de um exemplo de procedimento armazenado, consulte a seção Exemplo a seguir neste artigo.
Adicione um script que testa o tipo:
- No Gerenciador de Soluções, clique com o botão direito do mouse no nó do projeto e selecione Adicionar, Script.....
- Na janela Adicionar Novo Item, selecione Script (Não em compilação) e especifique um nome, como
Test.sql
. Selecione o botão Adicionar. - No Gerenciador de Soluções, clique duas vezes no nó
Test.sql
para abrir o arquivo de origem do script de teste padrão. - Adicione o script de teste (que invoque o código a ser depurado) no editor de texto. Consulte o exemplo na próxima seção para ver um exemplo de script.
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.
No menu Depurar, selecione Iniciar Depuração para compilar, implantar e testar o projeto. O script de teste em
Test.sql
é executado, e o objeto de banco de dados gerenciado é chamado.Quando a seta amarela (que indica o ponteiro de instruções) aparece no ponto de interrupção, a execução do código é interrompida. Em seguida, você pode depurar seu objeto de banco de dados gerenciado:
- Use Depuração Parcial no menu Depurar para avançar o ponteiro de instruções até a próxima linha de código.
- Use a janela Locais para observar o estado dos objetos atualmente destacados pelo ponteiro de instruções.
- Adicione variáveis à janela Inspeção. Você pode observar o estado das variáveis observadas em toda a sessão de depuração, mesmo quando a variável não estiver na linha de código realçada atualmente pelo ponteiro de instrução.
- Selecione Continuar no menu Depurar para avançar o ponteiro de instruções 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.
Código de exemplo
O exemplo de 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;