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:
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.
Crie um novo tipo de CLR SQL (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 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.
- Especifique um nome para o arquivo de origem do novo tipo e selecione Adicionar.
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.
Adicione um script que teste 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 na 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 (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.
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 " 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.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:
- Use Step Over do menu Debug para avançar o ponteiro de instruções para a próxima linha de código.
- Use a janela Locals para observar o estado dos objetos atualmente realçados pelo ponteiro de instrução.
- 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.
- 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;