Dela via


Så här felsöker du CLR-databasobjekt

gäller för:SQL Server

SQL Server har stöd för felsökning av Transact-SQL- och CLR-objekt (Common Language Runtime) i databasen. De viktigaste aspekterna av felsökning i SQL Server är hur enkelt det är att konfigurera och använda och integreringen av SQL Server-felsökningsprogrammet med Microsoft Visual Studio-felsökningsprogrammet. Dessutom fungerar felsökning mellan olika språk. Användare kan sömlöst gå in i CLR-objekt från Transact-SQL och vice versa.

Det Transact-SQL felsökningsprogrammet i SQL Server Management Studio kan inte användas för att felsöka hanterade databasobjekt, men du kan felsöka objekten med hjälp av felsökarna i Visual Studio. Felsökning av hanterade databasobjekt i Visual Studio stödjer alla vanliga felsökningsfunktioner, till exempel gå in i och gå förbi instruktioner inom rutiner som körs på servern. Felsökare kan ange brytpunkter, inspektera anropsstacken, inspektera variabler och ändra variabelvärden vid felsökning.

Felsöka behörigheter och begränsningar

Felsökning är en mycket privilegierad åtgärd och därför tillåts endast medlemmar i sysadmin fast serverroll att göra det i SQL Server.

Följande begränsningar gäller vid felsökning:

  • Felsökning av CLR-rutiner är begränsad till en felsökningsinstans i taget. Den här begränsningen gäller eftersom all CLR-kodkörning fryser när en brytpunkt nås och körningen inte fortsätter förrän debuggern avancerar från brytpunkten. Du kan dock fortsätta att felsöka Transact-SQL i andra anslutningar. Även om Transact-SQL-felsökning inte stoppar andra körningar på servern, kan det orsaka att andra anslutningar får vänta genom att hålla ett lås.

  • Redan existerande anslutningar kan inte felsökas, bara nya anslutningar kan det, eftersom SQL Server kräver information om klienten och felsökningsmiljön innan anslutningen kan etableras.

Vi rekommenderar därför att Transact-SQL- och CLR-kod debuggas på en testserver och inte på en produktionsserver.

Överblick

Felsökning i SQL Server följer en modell per anslutning. Ett felsökningsprogram kan bara identifiera och felsöka aktiviteter på den klientanslutning som den ansluter till. Eftersom funktionerna i felsökningsprogrammet inte begränsas av typen av anslutning kan både TDS- och HTTP-anslutningar kopplas bort. SQL Server tillåter dock inte felsökning av befintliga anslutningar. Felsökning stöder alla vanliga felsökningsfunktioner i rutiner som körs på servern. Interaktionen mellan ett felsökningsprogram och SQL Server sker via COM (Distributed Component Object Model).

Mer information och scenarier om felsökning av hanterade lagrade procedurer, funktioner, utlösare, användardefinierade typer och aggregeringar finns i SQL Server CLR Integration Database-felsökning i Visual Studio-dokumentationen.

TCP/IP-nätverksprotokollet måste vara aktiverat på SQL Server-instansen för att kunna använda Visual Studio för fjärrutveckling, felsökning och utveckling. Mer information om hur du aktiverar TCP/IP-protokoll på servern finns i Konfigurera klientprotokoll.

Felsökningssteg

Använd följande steg för att felsöka ett CLR-databasobjekt i Microsoft Visual Studio:

  1. Öppna Microsoft Visual Studio och skapa ett nytt SQL Server-projekt. Du kan använda SQL LocalDB-instansen som medföljer Visual Studio.

  2. Skapa en ny SQL CLR-typ (C#):

    1. I Solution Explorerhögerklickar du på projektet och väljer Lägg till, Nytt objekt....
    2. I fönstret Lägg till nytt objekt väljer du SQL CLR C# Stored Procedure, SQL CLR C# User-Defined Function, SQL CLR C# User-Defined Type, SQL CLR C# Trigger, SQL CLR C# Aggregate, eller Class.
    3. Ange ett namn på källfilen av den nya typen och välj sedan Lägg till.
  3. Lägg till kod för den nya typen i textredigeraren. Exempelkod för ett exempel på lagrad procedur finns i följande exempelavsnitt i den här artikeln.

  4. Lägg till ett skript som testar typen:

    1. I Solution Explorerhögerklickar du på projektnoden och väljer Lägg tillskript....
    2. I fönstret Lägg till nytt objekt väljer du Script (Not in build)och anger ett namn, till exempel Test.sql. Välj knappen Lägg till.
    3. I Solution Explorerdubbelklickar du på noden Test.sql för att öppna standardfilen för testskriptkällan.
    4. Lägg till testskriptet (ett som anropar koden som ska debuggas) i textredigeraren. Se exemplet i nästa avsnitt för ett exempelskript.
  5. Placera en eller flera brytpunkter i källkoden. Högerklicka på en kodrad i textredigeraren på den funktion eller rutin som du vill felsöka. Välj Brytpunkt, Infoga brytpunkt. Brytpunkten läggs till, vilket markerar kodraden i rött.

  6. I menyn Felsökning väljer du Starta felsökning för att kompilera, distribuera och testa projektet. Testskriptet i Test.sql körs och det hanterade databasobjektet anropas.

  7. När den gula pilen (som anger instruktionspekaren) visas vid brytpunkten pausas kodkörningen. Du kan sedan felsöka ditt hanterade databasobjekt:

    1. Använd Step Over från menyn Debug för att flytta instruktionspekaren till nästa kodrad.
    2. Använd fönstret Locals för att observera tillståndet för de objekt som för närvarande är markerade med instruktionspekaren.
    3. Lägg till variabler i fönstret Watch. Du kan se tillståndet för övervakade variabler under felsökningssessionen, även om variabeln inte finns på den kodrad som för närvarande markeras av instruktionspekaren.
    4. Välj Fortsätt från menyn Felsök för att gå vidare med instruktionspekaren till nästa brytpunkt eller för att slutföra körningen av rutinen om det inte finns några fler brytpunkter.

Exempelkod

Följande C#-exempel returnerar SQL Server-versionen till anroparen.

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

Exempel på testskript

Följande testskript visar hur du anropar den GetVersion lagrade proceduren som definierades i föregående exempel.

EXECUTE GetVersion;