CLR データベース オブジェクトのデバッグ

SQL Server では、データベース内の Transact-SQL オブジェクトと CLR (共通言語ランタイム) オブジェクトのデバッグがサポートされます。SQL Server でのデバッグの重要な特徴は、セットアップと使用が容易になったことと、SQL Server デバッガーと Microsoft Visual Studio デバッガーが統合されたことです。さらに、複数の言語にまたがったデバッグを実行できます。ユーザーは Transact-SQL から CLR オブジェクト (またはその逆) にシームレスにステップインできます。SQL Server Management Studio の SQL Server Transact-SQL デバッガーを使用してマネージ データベース オブジェクトをデバッグすることはできませんが、Visual Studio のデバッガーを使用すると、このオブジェクトをデバッグすることができます。Visual Studio でのマネージ データベース オブジェクトのデバッグでは、サーバーで実行するルーチン内の "step into" ステートメントや "step over" ステートメントなど、一般的なデバッグ機能すべてがサポートされます。デバッグ中は、ブレークポイントの設定、呼び出し履歴の調査、変数の調査、変数値の変更を行うことができます。Visual Studio .NET 2003 は、CLR 統合プログラミングまたはデバッグには使用できない点に注意してください。SQL Server には .NET Framework がプレインストールされていますが、Visual Studio .NET 2003 では .NET Framework 2.0 アセンブリを使用できません。

Visual Studio を使用したマネージ コードのデバッグの詳細については、Visual Studio ドキュメントの「マネージ コードのデバッグ」を参照してください。

デバッグに関する権限と制限事項

デバッグは高度な権限を必要とする操作なので、SQL Server でこの操作を行うには、sysadmin 固定サーバー ロールのメンバーである必要があります。

デバッグ中には、次の制限事項が適用されます。

  • CLR ルーチンを同時にデバッグできるデバッガー インスタンスは 1 つに制限されます。この制限が適用されるのは、ブレークポイントに到達するとすべての CLR コードの実行が停止し、デバッガーがブレークポイントから先に動作を進めるまで、コードの実行を再開できないことが理由です。ただし、他の接続での Transact-SQL のデバッグは続行できます。Transact-SQL デバッグによりサーバーの他の実行が停止することはありませんが、デバッグがロックをかけると、他の接続が待機することになる場合があります。

  • デバッグできるのは、既存の接続ではなく新しい接続のみです。これは、SQL Server が、接続が行われる前のクライアントとデバッガーの環境に関する情報を必要とするためです。

Transact-SQL コードと CLR コードのデバッグは、上記の制限事項により、実稼働サーバーではなくテスト サーバーで行うことをお勧めします。

マネージ データベース オブジェクトのデバッグの概要

SQL Server のデバッグは、接続ごとのモデルに準拠します。デバッガーは、デバッガーがアタッチされているクライアント接続のみに関係したアクティビティを検出してデバッグを実行することができます。デバッガーの機能は、接続の種類による制限を受けないので、表形式のデータ ストリーム (TDS) 接続と HTTP 接続の両方をデバッグできます。ただし、SQL Server では、既存の接続をデバッグできません。デバッグでは、サーバーで実行するルーチン内のすべての一般的なデバッグ機能をサポートします。デバッガーと SQL Server との間のやり取りは、分散 COM (コンポーネント オブジェクト モデル) 経由で行われます。

マネージ ストアド プロシージャ、関数、トリガー、ユーザー定義型、および集計のデバッグの詳細とシナリオについては、Visual Studio ドキュメントの「SQL CLR データベースのデバッグ」を参照してください。

Visual Studio を使用してリモートで開発およびデバッグを行うには、SQL Server インスタンスで TCP/IP ネットワーク プロトコルを有効にする必要があります。サーバー上で TCP/IP プロトコルを有効にする方法の詳細については、「クライアント ネットワーク プロトコルの構成」を参照してください。

マネージ データベース オブジェクトをデバッグするには

  1. Microsoft Visual Studio を開き、新しい SQL Server プロジェクトを作成して、SQL Server のインスタンスでデータベースへの接続を確立します。

  2. 新しい型を作成します。ソリューション エクスプローラーでプロジェクトを右クリックし、[新しい項目の追加] ウィンドウで [追加] および [新しい項目] をクリックし、[ストアド プロシージャ][ユーザー定義の関数][ユーザー定義型][トリガー][集計]、または [クラス] をクリックします。新しい型のソース ファイルの名前を指定し、[追加] をクリックします。

  3. テキスト エディターに新しい型のコードを追加します。ストアド プロシージャの例のサンプル コードについては、後のセクションを参照してください。

  4. 型をテストするスクリプトを追加します。ソリューション エクスプローラー[テスト スクリプト] ディレクトリを展開し、Test.sql をダブルクリックして既定のテスト スクリプト ソース ファイルを開きます。デバッグするコードを呼び出すテスト スクリプトをテキスト エディターに追加します。サンプル スクリプトについては、下記を参照してください。

  5. ソース コードに 1 つ以上のブレークポイントを配置します。テキスト エディター内の、デバッグする関数またはルーチン内で、コード行を右クリックし、[ブレークポイント] および [ブレークポイントの挿入] をクリックします。ブレークポイントが追加され、コード行が赤で強調表示されます。

  6. [デバッグ] メニューで [デバッグ開始] をクリックし、プロジェクトをコンパイル、配置、およびテストします。Test.sql のテスト スクリプトが実行され、マネージ データベース オブジェクトが呼び出されます。

  7. 命令ポインターを表す黄色い矢印がブレークポイントに表示されると、コードの実行が一時停止され、マネージ データベース オブジェクトのデバッグを開始できます。[デバッグ] メニューの [ステップ オーバー] により、命令ポインターをコードの次の行に進めることができます。命令ポインターにより現在強調表示されているオブジェクトの状態を監視するには、[ローカル] ウィンドウが使用されます。[ウォッチ] ウィンドウに変数を追加することができます。監視される変数の状態は、変数が命令ポインターにより現在強調表示されているコード行にあるときだけでなく、デバッグ セッション全体で見ることができます。[デバッグ] メニューの [続行] をクリックし、命令ポインターを次のブレークポイントに進めるか、ブレークポイントがこれ以上ない場合にはルーチンの実行を完了します。

次の例では、SQL Server のバージョンを呼び出し元に返します。

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

上で定義した GetVersion ストアド プロシージャを呼び出すテスト スクリプトを次に示します。

EXEC GetVersion