Udostępnij za pośrednictwem


Jak debugować obiekty bazy danych CLR

Dotyczy:programu SQL Server

Program SQL Server zapewnia obsługę debugowania obiektów Transact-SQL i środowiska uruchomieniowego języka wspólnego (CLR) w bazie danych. Kluczowe aspekty debugowania w programie SQL Server to łatwość instalacji i użycia oraz integracja debugera programu SQL Server z debugerem programu Microsoft Visual Studio. Ponadto debugowanie działa w różnych językach. Użytkownicy mogą bezproblemowo przechodzić do obiektów CLR z języka Transact-SQL i na odwrót.

Debuger Transact-SQL w programie SQL Server Management Studio nie może służyć do debugowania zarządzanych obiektów bazy danych, ale można debugować obiekty przy użyciu debugerów w programie Visual Studio. Debugowanie obiektów zarządzanej bazy danych w programie Visual Studio obsługuje wszystkie typowe funkcje debugowania, takie jak przechodzenie do i przechodzenie przez instrukcje w ramach procedur wykonywanych na serwerze. Debugery mogą ustawiać punkty przerwania, sprawdzać stos wywołań, sprawdzać zmienne i modyfikować wartości zmiennych podczas debugowania.

Debugowanie uprawnień i ograniczeń

Debugowanie jest operacją o wysokim poziomie uprawnień, dlatego tylko członkowie sysadmin stałej roli serwera mogą to zrobić w programie SQL Server.

Podczas debugowania obowiązują następujące ograniczenia:

  • Debugowanie procedur CLR można wykonywać przy użyciu tylko jednego wystąpienia debugera jednocześnie. To ograniczenie ma zastosowanie, ponieważ całe wykonywanie kodu CLR zawiesza się, gdy punkt przerwania zostanie trafiony, a wykonanie nie będzie kontynuowane, dopóki debuger nie przechodzi z punktu przerwania. Można jednak kontynuować debugowanie Transact-SQL w innych połączeniach. Chociaż debugowanie Transact-SQL nie blokuje innych wykonań na serwerze, może spowodować, że inne połączenia będą czekać, przez utrzymywanie blokady.

  • Istniejące połączenia nie mogą być debugowane, tylko nowe połączenia, ponieważ program SQL Server wymaga informacji o środowisku klienta i debugera przed nawiązaniem połączenia.

Dlatego zaleca się debugowanie kodu Transact-SQL i CLR na serwerze testowym, a nie na serwerze produkcyjnym.

Przegląd

Debugowanie w programie SQL Server jest zgodne z modelem poszczególnych połączeń. Debugger może wykrywać i debugować działania tylko na połączeniu klienta, do którego jest podłączony. Ponieważ funkcjonalność debugera nie jest ograniczona przez typ połączenia, oba strumienie danych tabelarycznych (TDS) i połączenia HTTP mogą być debugowane. Jednak program SQL Server nie zezwala na debugowanie istniejących połączeń. Debugowanie obsługuje wszystkie typowe funkcje debugowania w ramach procedur wykonywanych na serwerze. Interakcja między debugerem a programem SQL Server odbywa się za pośrednictwem rozproszonego modelu obiektów składników (COM).

Aby uzyskać więcej informacji i scenariuszy dotyczących debugowania zarządzanych procedur składowanych, funkcji, wyzwalaczy, typów zdefiniowanych przez użytkownika i agregacji, zobacz Debugowanie bazy danych integracji CLR programu SQL Server w dokumentacji programu Visual Studio.

Protokół sieciowy TCP/IP musi być włączony w wystąpieniu programu SQL Server, aby można było używać programu Visual Studio do zdalnego programowania, debugowania i programowania. Aby uzyskać więcej informacji na temat włączania protokołu TCP/IP na serwerze, zobacz Configure Client Protocols.

Kroki debugowania

Wykonaj następujące kroki, aby debugować obiekt bazy danych CLR w programie Microsoft Visual Studio:

  1. Otwórz program Microsoft Visual Studio i utwórz nowy projekt programu SQL Server. Możesz użyć wystąpienia usługi SQL LocalDB dostarczanego z programem Visual Studio.

  2. Utwórz nowy typ środowiska SQL CLR (C#):

    1. W eksploratorze rozwiązań kliknij prawym przyciskiem myszy projekt, a następnie wybierz pozycję Dodaj, nowy element....
    2. W oknie Dodaj nowy element wybierz pozycję procedury składowanej SQL CLR C#, User-Definedfunkcji JĘZYKA C# języka C# języka C# SQL CLR C# User-Defined Type, wyzwalacz języka C# ŚRODOWISKA SQL CLR C#, SQL CLR C# Aggregatelub Class.
    3. Określ nazwę pliku źródłowego nowego typu, a następnie wybierz pozycję Dodaj.
  3. Dodaj kod nowego typu do edytora tekstów. Przykładowy kod przykładowej procedury składowanej można znaleźć w poniższej sekcji Przykład w tym artykule.

  4. Dodaj skrypt, który testuje typ:

    1. W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy węzeł projektu i wybierz pozycję Dodaj, Skrypt....
    2. W oknie Dodaj nowy element wybierz pozycję skrypt (nie kompilacji)i określ nazwę, taką jak Test.sql. Wybierz przycisk Dodaj.
    3. W Eksplorator rozwiązańkliknij dwukrotnie węzeł Test.sql, aby otworzyć domyślny plik źródłowy skryptu testowego.
    4. Dodaj skrypt testowy (wywołujący kod do debugowania) do edytora tekstów. Zobacz przykład w następnej sekcji przykładowego skryptu.
  5. Umieść co najmniej jeden punkt przerwania w kodzie źródłowym. Kliknij prawym przyciskiem myszy wiersz kodu w edytorze tekstów w funkcji lub procedurze, którą chcesz debugować. Wybierz Punkt przerwania, Wstaw punkt przerwania. Dodano punkt przerwania z wyróżnionym wierszem kodu na czerwono.

  6. W menu debugowania wybierz pozycję Rozpocznij debugowanie, aby skompilować, wdrożyć i przetestować projekt. Skrypt testowy w Test.sql jest uruchamiany, a obiekt zarządzanej bazy danych jest wywoływany.

  7. Gdy żółta strzałka (wyznaczanie wskaźnika instrukcji) pojawi się w punkcie przerwania, wykonywanie kodu zostanie wstrzymane. Następnie można debugować zarządzany obiekt bazy danych:

    1. Użyj Przejdź dalej z menu Debug, aby przesunąć wskaźnik instrukcji do następnego wiersza kodu.
    2. Użyj okna Locals, aby obserwować stan obiektów aktualnie wyróżnionych przez wskaźnik instrukcji.
    3. Dodaj zmienne do okna Watch. Możesz obserwować stan obserwowanych zmiennych w całej sesji debugowania, nawet jeśli zmienna nie znajduje się w wierszu kodu aktualnie wyróżnionego przez wskaźnik instrukcji.
    4. Wybierz pozycję Kontynuuj z menu Debug, aby przejść wskaźnikiem do następnego punktu przerwania lub zakończyć wykonywanie procedury, jeśli nie ma więcej punktów przerwania.

Przykładowy kod

Poniższy przykład w języku C# zwraca wersję programu SQL Server do obiektu wywołującego.

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

Przykładowy skrypt testowy

Poniższy skrypt testowy pokazuje, jak wywołać procedurę składowaną GetVersion zdefiniowaną w poprzednim przykładzie.

EXECUTE GetVersion;