次の方法で共有


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

SQL Server では、データベース内の Transact-SQL オブジェクトと CLR (共通言語ランタイム) オブジェクトのデバッグがサポートされます。SQL Server でのデバッグの重要な特徴は、セットアップと使用が容易になったことと、SQL Server デバッガと Microsoft Visual Studio デバッガが統合されたことです。さらに、複数の言語にまたがったデバッグを実行できます。ユーザーは Transact-SQL から CLR オブジェクト (またはその逆) にシームレスにステップ インできます。SQL Server Management Studio の SQL Server 2008 Transact-SQL デバッガを使用してマネージ データベース オブジェクトをデバッグすることはできませんが、Visual Studio 2005 Professional Edition および Visual Studio 2005 Team Suite Edition のデバッガを使用すると、このオブジェクトをデバッグすることができます。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 2005 を開き、新しい 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