Edited at
RossoDay 17

SQLServerで実行されたSQLやストアドをキャプチャする方法

More than 1 year has passed since last update.


はじめに


  • クライアント:Windowsアプリ

  • サーバ:SQLServer

といった構成のシステムを約7年ほどやってきたのですが、

年月経ち、プロジェクトに人の入れ替え等が発生すると、

仕様書が更新されておらず、ソースから仕様を解析するということ、

エンジニアのみなさんならご経験があるかと思います。。。

私が仕様解析で一番苦労したのが画面とデータの解析でしたが、

その際に役立ったツールが、今回紹介する「SQLServerProfiler」というツールになります。

自前でサーバを立てず、クラウドを使用する風潮の昨今、

需要は少ないかもしれませんが、本記事が、

自分と同じ苦労をされているエンジニアの皆さんの助けとなれば幸いです。


環境説明

環境は以下となります。


  • Windows10 64bit

  • Visual Studio 2017 Community

  • .NET Framework 4.6.1

  • SQL Server 2017 Developer

SQLServer2017では、Developerというエディションが出ており、

統合環境である「SQLServerManagementStudio」の機能が

無料かつ無制限で使えるようです。

インストーラーはここから入手できます。

余裕あったら、SQLServer2017のインストール手順記事も作成しようと思いますが、

今回は上記環境が用意されている状態を前提に進めさせていただきます。

また、本記事の記載している手順で試せるよう、

githubにクエリおよびソースをを格納していますので、

あわせて確認いただけると幸いです。

https://github.com/zakizaki-ri9/SQLServerProfilerSample


SQLServer

「SQL Server Management Studio」を起動してください。

ログイン先のサーバーはlocalhost 、ユーザーはsa で問題ありません。

「オブジェクトエクスプローラー」を右クリック、

SampleDBというデータベースを新規作成します。

(オプションなど、細かい設定は不要です。)

21.png

以下クエリを実行し、テーブルと初期データを設定します。


01_create_table.sql

use SampleDB

if exists(select obj.* from sys.objects as obj where obj.name = N'SampleTable')
begin
drop table SampleTable
end

create table SampleTable
(
id int
, sample_name nvarchar(max)
, option_a nvarchar(max)
)

insert into SampleTable select 1, N'AAA', N''
insert into SampleTable select 2, N'BBB', N'a'
insert into SampleTable select 3, N'CCC', N''
insert into SampleTable select 4, N'AAA', N'a'


以下クエリを実行し、検証用のストアドプロシージャを登録します。


02_create_procedure.sql

USE SampleDB

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

DROP PROCEDURE GetSampleTable
GO

CREATE PROCEDURE GetSampleTable
@sample_name NVARCHAR(MAX) = null
, @option_a NVARCHAR(MAX) = null
AS
BEGIN
SET NOCOUNT ON;

SELECT * FROM SampleTable WHERE
(@sample_name IS NULL OR sample_name = @sample_name) AND
(@option_a IS NULL OR option_a = @option_a)
END
GO



Windowsアプリ

githubからSqlServerProfilerSampleをダウンロードし、

Visual Studio 2017からSQLServerProfilerSample.slnを開いてください。

ご自身の環境にあわせてForm1.cs/CreateConnection()に定義されているSQLServerへのログイン情報を変更してください。


Form1.cs

        private string CreateConnectionString()

{
// 接続文字列生成
var conStrBuilder = new SqlConnectionStringBuilder()
{
DataSource = "localhost",
InitialCatalog = "SampleDB",
UserID = "sa",
Password = "pass"
};
return conStrBuilder.ToString();
}

Debug実行し、以下のWindowが起動すれば準備OKです。

22.png


SQLServerProfilerを試す

では実際にSQLServerProfilerを試していきたいと思います。


SQLServerProfilerの設定`

SQLServerManegementStudioから、

「ツール」→「SQLServerプロファイラー」を起動してください。

23.png

SQLServerManegementStudioを起動した時同様、ログインが求められます。

SQLServerManegementStudioログイン時と同じ情報を入力し、ログインしてください。

24.png

以下の画面が表示されますので、タブ「イベントの選択」を選択してください。

25.png

タブ「イベントの選択」では、

ログオンしたサーバーで発生する様々なイベントをキャプチャするための

条件を指定することが可能です。

今回は、ストアドプロシージャとSQL発行のみをキャプチャしますので、

「RPC:Completed、SQL:BatchCompleted」以外のチェックは外します。

26.png

では、「実行」ボタンをクリックします。

クリック後、即キャプチャが始まってしまいますので、

「一時停止」ボタンをクリックし、以下赤枠の状態にします。

27.png


キャプチャ実行

それでは、キャプチャを実行していきます。

先ほどのWindowsアプリを起動します。

SQLServerProfilerの「再生」ボタンをクリックし、

Windowsアプリのボタンを適当にぽちぽちクリック、

その後、SQLServerProfilerの「一時停止」ボタンをクリックしてください。

28.png

本記事作成時は、Windowsアプリからストアド「sample_〜」ボタン、

SQL「option〜」ボタンをクリックしています。

すると、SQLServerProfilerで以下のようなキャプチャが取れています。

青枠はストアド、赤枠はSQL発行時のキャプチャになります。

29.png

青枠と赤枠の行をCtrl+左クリックで選択すると、

SQLServerに対して実行されたクエリが以下赤枠のように表示されます。

30.png

以上です。お疲れ様でした。


おわりに

他にもイベントやフィルタの設定を行うことで、

様々なキャプチャを行うことができます。

今回用意したWindowsアプリでは、ストアド・SQL発行のパターンでしたが、

EntityFramework等のORマッパーを通じてのSQL発行もキャプチャ可能なはずですので、

ソース解析といったシーンだけでなく、動作確認時等のシーンでもご活用いただければ幸いです。

また、今回初投稿でしたが、いかがだったでしょうか。

(ちょっと内容が冗長かな・・・というのが自分の正直な感想ですw)

内容等お気づきの点がありましたら、ご指摘いただけると大変助かります。