Condividi tramite


Debug di oggetti di database CLR

SQL Server fornisce il supporto per il debug di oggetti Transact-SQL e CLR (Common Language Runtime) nel database. Gli aspetti principali del debug in SQL Server sono la facilità di installazione e utilizzo e l'integrazione del debugger di SQL Server con il debugger di Microsoft Visual Studio. Inoltre, il debug funziona tra linguaggi diversi. Gli utenti possono passare senza problemi agli oggetti CLR da Transact-SQL e viceversa. Il debugger Transact-SQL in SQL Server Management Studio non può essere usato per eseguire il debug di oggetti di database gestiti, ma è possibile eseguire il debug degli oggetti usando i debugger in Visual Studio. Il debug di oggetti di database gestiti in Visual Studio supporta tutte le funzionalità di debug comuni, ad esempio le istruzioni "esegui istruzione" e "esegui il passaggio" all'interno delle routine in esecuzione nel server. Tramite i debugger è possibile impostare punti di interruzione, controllare lo stack di chiamate, controllare le variabili e modificarne i valori durante il debug. Si noti che Non è possibile usare Visual Studio .NET 2003 per la programmazione o il debug dell'integrazione con CLR. SQL Server include .NET Framework preinstallato e Visual Studio .NET 2003 non può usare gli assembly .NET Framework 2.0.

Per altre informazioni sul debug di codice gestito con Visual Studio, vedere l'argomento "Debug di codice gestito" nella documentazione di Visual Studio.

Debug di autorizzazioni e restrizioni

Il debug è un’operazione con privilegi elevati, pertanto, solo i membri del ruolo predefinito del server amministratore di sistema possono eseguire il debug in SQL Server.

Durante il debug vengono applicate le restrizioni seguenti:

  • Il debug di routine CLR è limitato a un'istanza di debugger alla volta. Questa limitazione si applica perché l'esecuzione di tutto il codice CLR si blocca quando viene raggiunto un punto di interruzione e l'esecuzione non continua finché il debugger non avanza dal punto di interruzione. Tuttavia, è possibile continuare il debug di Transact-SQL in altre connessioni. Anche se Transact-SQL debug non blocca altre esecuzioni nel server, potrebbe causare l'attesa di altre connessioni tenendo premuto un blocco.

  • Non è possibile eseguire il debug delle connessioni esistenti, perché SQL Server richiede informazioni sull'ambiente client e debugger prima di poter effettuare la connessione.

A causa delle restrizioni precedenti, è consigliabile eseguire il debug del codice Transact-SQL e CLR in un server di test e non in un server di produzione.

Panoramica del debug di oggetti di database gestiti

Il debug in SQL Server si basa su un modello per connessione. Un debugger può rilevare ed eseguire il debug delle attività solo alla connessione client a cui è collegato. Poiché la funzionalità del debugger non è limitata dal tipo di connessione, è possibile eseguire il debug di entrambe le connessioni TDS (Tabular Data Stream) e HTTP. TUTTAVIA, SQL Server non consente il debug di connessioni esistenti. Il debug supporta tutte le caratteristiche di debug comuni all'interno di routine in esecuzione nel server. L'interazione tra un debugger e SQL Server viene effettuata tramite Distributed Component Object Model (COM).

Per altre informazioni e scenari sul debug di stored procedure gestite, funzioni, trigger, tipi definiti dall'utente e aggregazioni, vedere l'argomento "Debug del database di integrazione CLR di SQL Server" nella documentazione di Visual Studio.

Il protocollo di rete TCP/IP deve essere abilitato nell'istanza di SQL Server per usare Visual Studio per lo sviluppo remoto, il debug e lo sviluppo. Per altre informazioni sull'abilitazione del protocollo TCP/IP nel server, vedi Configurare i protocolli client.

Per eseguire il debug di un oggetto di database gestito

  1. Aprire Microsoft Visual Studio, creare un nuovo progetto di SQL Server e stabilire una connessione a un database in un'istanza di SQL Server.

  2. Creare un nuovo tipo. In Esplora soluzioni fare clic con il pulsante destro del mouse sul progetto, scegliere Aggiungi e Nuovo elemento... Nella finestra Aggiungi nuovo elemento selezionare Stored procedure, User-Defined Funzione, User-Defined Tipo, Trigger, Aggregazione o Classe. Specificare un nome per il file di origine del nuovo tipo e fare clic su Aggiungi.

  3. Aggiungere il codice per il nuovo tipo nell'editor di testo. Per il codice di esempio per una stored procedure di esempio, vedere la sezione più avanti in questo argomento.

  4. Aggiungere uno script che testa il tipo. In Esplora soluzioni espandere la directory TestScripts facendo doppio clic su Test.sql per aprire il file di origine dello script di test predefinito. Aggiungere lo script di test, uno che richiama il codice di cui eseguire il debug, all'editor di testo. Vedere di seguito per uno script di esempio.

  5. Inserire uno o più punti di interruzione nel codice sorgente. Fare clic con il pulsante destro del mouse su una riga di codice nell'editor di testo, all'interno della funzione o della routine di cui si vuole eseguire il debug e selezionare Punto di interruzione e Inserisci punto di interruzione. Il punto di interruzione viene aggiunto e la riga di codice viene evidenziata in rosso.

  6. Nel menu Debug seleziona Avvia debug per generare, implementare e testare il progetto. Lo script di test in Test.sql verrà eseguito e verrà richiamato l'oggetto di database gestito.

  7. Quando la freccia gialla che designa il puntatore all'istruzione viene visualizzato in corrispondenza della sospensione dell'esecuzione del codice del punto di interruzione ed è possibile iniziare a eseguire il debug dell'oggetto di database gestito. È possibile passare dal menu Debug per passare il puntatore dell'istruzione alla riga di codice successiva. La finestra Variabili locali viene utilizzata per osservare lo stato degli oggetti attualmente evidenziati dal puntatore all'istruzione. È possibile aggiungere variabili alla finestra Espressione di controllo . Lo stato delle variabili di controllo può essere osservato nell'intera sessione di debug, non solo quando la variabile si trova nella riga di codice attualmente evidenziata dal puntatore all'istruzione. Selezionare Continua dal menu Debug per passare il puntatore dell'istruzione al punto di interruzione successivo o per completare l'esecuzione della routine se non sono presenti altri punti di interruzione.

Esempio

Nell'esempio seguente viene restituita la versione di SQL Server al chiamante.

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  

Di seguito è riportato uno script di test che richiama la stored procedure GetVersion definita in precedenza.

EXEC GetVersion  

Vedere anche

Concetti relativi alla programmazione dell'integrazione di Common Language Runtime (CLR)