Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 3 years have 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)

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

zaki_zaki
お酒と野毛が好きです。最近はPython/TypeScript/Vue.js/アーキテクチャパターンあたりを勉強中です。Qiitaでは、軽めの記事書きます。
https://kic-yuuki.hatenablog.com/
visasq
ビザスクは「知見と、挑戦をつなぐ」をミッションに、世界で1番のナレッジプラットフォームをつくっています。 様々なニーズにつなぐことで、実際に経験したことで得られた知識や意見を、知見として価値最大化します。組織、世代、地域を超えて、知見を集めつなぐことで、世界中のイノベーションに貢献します。
https://visasq.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away