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 でのマネージド データベース オブジェクトのデバッグでは、サーバー上で実行されるルーチン内の "ステップ イン" ステートメントや "ステップ オーバー" ステートメントなど、すべての一般的なデバッグ機能がサポートされています。 デバッガーでは、デバッグ中にブレークポイントの設定、呼び出し履歴の検査、変数の検査、変数値の変更を行うことができます。 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 Server CLR Integration Database Debugging」トピックを参照してください。
リモート開発、デバッグ、開発に Visual Studio を使用するには、SQL Server インスタンスで TCP/IP ネットワーク プロトコルを有効にする必要があります。 サーバーで TCP/IP プロトコルを有効にする方法の詳細については、「クライアント プロトコルの構成」を参照してください。
マネージド データベース オブジェクトをデバッグするには
Microsoft Visual Studio を開き、新しい SQL Server プロジェクトを作成し、SQL Server のインスタンス上のデータベースへの接続を確立します。
新しい型を作成します。 ソリューション エクスプローラーで、プロジェクトを右クリックし、[追加と新しい項目]を選択します。[新しい項目の追加] ウィンドウで、ストアド プロシージャ、 User-Defined 関数、 User-Defined 型、トリガー、集計、またはクラスを選択します。 新しい種類のソース ファイルの名前を指定し、[ 追加] をクリックします。
新しい型のコードをテキスト エディターに追加します。 ストアド プロシージャの例のサンプル コードについては、このトピックの後半のセクションを参照してください。
型をテストするスクリプトを追加します。 ソリューション エクスプローラーで、TestScripts ディレクトリをダブルクリックTest.sql、既定のテスト スクリプト ソース ファイルを開きます。 デバッグするコードを呼び出すテスト スクリプトをテキスト エディターに追加します。 サンプル スクリプトについては、以下を参照してください。
ソース コードに 1 つ以上のブレークポイントを配置します。 デバッグする関数またはルーチン内のテキスト エディターでコード行を右クリックし、[ ブレークポイント ] と [ ブレークポイントの挿入] を選択します。 ブレークポイントが追加され、コード行が赤で強調表示されます。
[ デバッグ ] メニューの [ デバッグの開始 ] を選択して、プロジェクトをコンパイル、配置、およびテストします。 Test.sqlのテスト スクリプトが実行され、マネージド データベース オブジェクトが呼び出されます。
ブレークポイントのコード実行に命令ポインターを示す黄色の矢印が表示されたら、一時停止し、マネージド データベース オブジェクトのデバッグを開始できます。 [デバッグ] メニューからステップ オーバーして、命令ポインターを次のコード行に進めることができます。 [ローカル] ウィンドウは、命令ポインターによって現在強調表示されているオブジェクトの状態を確認するために使用されます。 [ ウォッチ ] ウィンドウに変数を追加できます。 監視された変数の状態は、変数が現在命令ポインターによって強調表示されているコード行にある場合だけでなく、デバッグ セッション全体で観察できます。 [デバッグ] メニューから [続行] を選択して、命令ポインターを次のブレークポイントに進めるか、ブレークポイントがなくなった場合にルーチンの実行を完了します。
例
次の例では、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