Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O SQL Server fornece suporte para depuração de objetos CLR (common language runtime) e Transact-SQL no banco de dados. Os principais aspectos 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 entre idiomas. Os usuários podem intervir perfeitamente 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ções "step into" e "step over" dentro das 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 variáveis durante a depuração. Observe que o Visual Studio .NET 2003 não pode ser usado para programação ou depuração de integração 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 a depuração de código gerenciado usando o Visual Studio, consulte o tópico "Depurando Código Gerenciado" na documentação do Visual Studio.
Permissões e restrições de depuração
A depuração é uma operação altamente privilegiada e, portanto, somente membros da função de servidor fixa sysadmin têm permissão para fazê-lo no SQL Server.
As seguintes restrições se aplicam durante a depuração:
A depuração de rotinas CLR é restrita a uma instância de depurador por vez. Essa limitação se aplica 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 do ponto de interrupção. No entanto, você pode continuar depurando Transact-SQL em outras conexões. Embora Transact-SQL depuração 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 o 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 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 pode detectar e depurar atividades somente à conexão do cliente à qual está anexado. 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 a depuração de conexões existentes. A depuração dá suporte a todos os recursos comuns de depuração em rotinas executadas no servidor. A interação entre um depurador e o SQL Server ocorre por meio do COM (Modelo de Objeto de Componente 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 ser habilitado na instância do 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
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.
Crie um novo tipo. 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çãoUser-Defined, Tipo deUser-Defined, Gatilho, Agregação ou Classe. Especifique um nome para o arquivo de origem do novo tipo e clique em Adicionar.
Adicione código para o novo tipo ao editor de texto. Para obter um código de exemplo para um procedimento armazenado de exemplo, consulte a seção mais adiante neste tópico.
Adicione um script que teste o tipo. No Gerenciador de Soluções, expanda o diretório TestScripts clicando duas vezes 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, ao editor de texto. Veja abaixo 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, 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, realçando 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 será executado e o objeto de banco de dados gerenciado será invocado.
Quando a seta amarela que designa o ponteiro de instrução aparece no ponto de interrupção, a execução do código é pausada e você pode começar a depurar o objeto de banco de dados gerenciado. Você pode percorrer o passo a passo no menu Depurar para avançar o ponteiro de instrução para a próxima linha de código. A janela Locals é usada para observar o estado dos objetos atualmente realçados pelo ponteiro de instrução. As variáveis podem ser adicionadas à janela Inspeção . O estado das variáveis observadas pode ser observado durante toda a sessão de depuração, não apenas quando a variável está 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ção 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.
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
Veja a seguir um script de teste que invoca o procedimento armazenado GetVersion definido acima.
EXEC GetVersion
Consulte Também
Conceitos de programação de integração do CLR (Common Language Runtime)