CLR データベース オブジェクトをデバッグする方法

適用対象:SQL Server

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

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

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

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

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

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

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

概要

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

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

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

デバッグの手順

Microsoft Visual Studio で CLR データベース オブジェクトをデバッグするには、次の手順に従います。

  1. Microsoft Visual Studio を開き、 [新しい SQL Server プロジェクトの作成] を選択します。 Visual Studio に付属する SQL LocalDB インスタンスを使用できます。

  2. 新しい SQL CLR 型の作成 (C#):

    1. ソリューション エクスプローラーでプロジェクトを右クリックして、[追加][新しい項目...] を選択します。
    2. [新しい項目の追加]ウィンドウで、SQL CLR C# ストアド プロシージャSQL CLR C# ユーザー定義関数SQL CLR C# ユーザー定義型SQL CLR C# トリガーSQL CLR C# 集計、またはクラスを選択します。
    3. 新しい種類のソース ファイルの名前を指定し、[追加] を選択します。
  3. テキスト エディターに新しい型のコードを追加します。 ストアド プロシージャの例のサンプル コードについては、この記事の次の「例」のセクションを参照してください。

  4. 型をテストするスクリプトを追加します。

    1. ソリューション エクスプローラーで、 プロジェクト ノードを右クリックして、[追加][スクリプト...] を選択します。
    2. [新しい項目の追加] ウィンドウで、[スクリプト] (ビルド内ではない) を選択し、Test.sql などの名前を指定します。 [追加] ボタンを選びます。
    3. ソリューション エクスプローラーで、Test.sql ノードをダブルクリックして、既定のテスト スクリプト ソース ファイルを開きます。
    4. テスト スクリプト(デバッグするコードを呼び出すスクリプト)をテキスト エディターに追加します。 サンプル スクリプトについては、次のセクションの例を参照してください。
  5. ソース コードに 1 つ以上のブレークポイントを配置します。 デバッグする関数またはルーチンのテキスト エディターで、コード行を右クリックします。 [ブレークポイント][ブレークポイントの挿入] の順に選択します。 ブレークポイントが追加され、コード行が赤で強調表示されます。

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

  7. 黄色い矢印 (命令ポインターを表す) がブレークポイントに表示されると、コードの実行が一時停止されます。 その後、マネージド データベース オブジェクトをデバッグできます。

    1. [デバッグ] メニューから ステップ オーバー を使用して、命令ポインターを次のコード行に進めます。
    2. [ローカル] ウィンドウを使用して、命令ポインターによって現在強調表示されているオブジェクトの状態を確認します。
    3. ウォッチ ウィンドウに変数を追加します。 監視される変数の状態は、変数が命令ポインターにより現在強調表示されているコード行にないときでも、デバッグ セッション全体で見ることができます。
    4. [デバッグ] メニューの [続行] を選択し、命令ポインターを次のブレークポイントに進めるか、ブレークポイントがこれ以上ない場合にはルーチンの実行を完了します。

コード例

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

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

テストスクリプトの例

次のテスト スクリプトは、前の例で定義した GetVersion ストアド プロシージャを呼び出す方法を示しています。

EXEC GetVersion  

次のステップ

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

詳細については、「共通言語ランタイム統合のプログラミング概念」を参照してください