次の方法で共有


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 でのマネージド データベース オブジェクトのデバッグでは、 へのステップ 、サーバーで実行されるルーチン内のステートメント ステップ オーバー など、すべての一般的なデバッグ機能がサポートされています。 デバッグ中は、ブレークポイントの設定、呼び出し履歴の調査、変数の調査、変数値の変更を行うことができます。

デバッグのアクセス許可と制限

デバッグは高度な特権が必要な操作であるため、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. [デバッグ] メニューの [続行] を選択し、命令ポインターを次のブレークポイントに進めるか、ブレークポイントがこれ以上ない場合にはルーチンの実行を完了します。

コード例

次の C# の例では、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 ストアド プロシージャを呼び出す方法を示しています。

EXECUTE GetVersion;