# 通知設計書 51-sp_BlitzWho未インストール

## 概要

本ドキュメントは、SQL Server診断ツールsp_BlitzFirst実行時にsp_BlitzWhoがインストールされていない場合に発生する警告通知について定義する。

### 本通知の処理概要

sp_BlitzFirstはSQL Serverのリアルタイム診断を行うストアドプロシージャであり、その実行中にsp_BlitzWhoを呼び出して現在実行中のクエリを分析する機能を持つ。本通知は、sp_BlitzWhoが必要なタイミングでインストールされていない場合にユーザーに警告を発する機能である。

**業務上の目的・背景**：sp_BlitzFirstは詳細な診断モード（ExpertMode）で実行される際、開始時と終了時にsp_BlitzWhoを呼び出して現在実行中のクエリ情報を収集する。sp_BlitzWhoが未インストールの場合、この重要な診断情報が欠落するため、ユーザーに通知して対応を促す必要がある。First Responder Kitの各ツールは独立してインストール可能であるが、完全な診断を行うためには関連ツールのインストールが推奨される。

**通知の送信タイミング**：sp_BlitzFirst実行時に、@SinceStartup = 0、@Seconds > 0、@ExpertMode = 1、@OutputType <> 'NONE'、かつ@OutputResultSetsに'BlitzWho_Start'または'BlitzWho_End'が含まれる場合にsp_BlitzWhoの存在チェックが行われ、未インストールの場合に通知が出力される。

**通知の受信者**：sp_BlitzFirstを実行したSQL Serverユーザー（DBA、運用担当者など）。

**通知内容の概要**：sp_BlitzWhoが現在のデータベースにインストールされていないことを通知し、FirstResponderKit.orgからの取得を案内する。

**期待されるアクション**：ユーザーはFirstResponderKit.org（http://FirstResponderKit.org）からsp_BlitzWhoをダウンロードし、現在のデータベースまたはmasterデータベースにインストールすることで、完全な診断機能を利用可能になる。

## 通知種別

コンソール出力（PRINT文）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（PRINT文による即時出力） |
| 優先度 | 中（警告レベル） |
| リトライ | なし |

### 送信先決定ロジック

sp_BlitzFirstを実行したセッションのコンソールに直接出力される。

## 通知テンプレート

### コンソール出力

| 項目 | 内容 |
|-----|------|
| 出力方法 | PRINT文 |
| メッセージタイプ | 情報メッセージ |

### 本文テンプレート

```
sp_BlitzWho is not installed in the current database_files.  You can get a copy from http://FirstResponderKit.org
```

### 添付ファイル

なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| なし | 固定メッセージのため変数なし | - | - |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| ストアドプロシージャ実行 | sp_BlitzFirst実行 | @SinceStartup = 0 AND @Seconds > 0 AND @ExpertMode = 1 AND @OutputType <> 'NONE' AND @OutputResultSets LIKE N'%BlitzWho_Start%' または '%BlitzWho_End%' | 詳細診断モードでBlitzWho結果セットを出力する設定の場合 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| OBJECT_ID('master.dbo.sp_BlitzWho') IS NOT NULL | masterデータベースにsp_BlitzWhoがインストールされている場合 |
| OBJECT_ID('dbo.sp_BlitzWho') IS NOT NULL | 現在のデータベースにsp_BlitzWhoがインストールされている場合 |
| @SinceStartup = 1 | サーバー起動時からの統計を取得するモードの場合 |
| @Seconds = 0 | サンプリング期間が0の場合 |
| @ExpertMode = 0 | 詳細モードが無効の場合 |
| @OutputType = 'NONE' | 出力タイプがNONEの場合 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[sp_BlitzFirst実行] --> B{@SinceStartup = 0?}
    B -->|No| Z[通知なし]
    B -->|Yes| C{@Seconds > 0?}
    C -->|No| Z
    C -->|Yes| D{@ExpertMode = 1?}
    D -->|No| Z
    D -->|Yes| E{@OutputType <> 'NONE'?}
    E -->|No| Z
    E -->|Yes| F{BlitzWho結果セット要求?}
    F -->|No| Z
    F -->|Yes| G{sp_BlitzWho存在?}
    G -->|Yes| H[sp_BlitzWho実行]
    G -->|No| I[PRINT 警告メッセージ]
    H --> J[終了]
    I --> J
    Z --> J
```

## データベース参照・更新仕様

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| sys.objects（OBJECT_ID関数経由） | sp_BlitzWhoの存在確認 | master.dbo.sp_BlitzWhoとdbo.sp_BlitzWhoをチェック |

### テーブル別参照項目詳細

#### sys.objects

| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| object_id | オブジェクト存在確認 | OBJECT_ID('master.dbo.sp_BlitzWho') または OBJECT_ID('dbo.sp_BlitzWho') |

### 更新テーブル一覧

なし

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| なし | 本通知はエラーではなく警告メッセージ | PRINT文による情報提供のみ |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0（リトライなし） |
| リトライ間隔 | - |
| リトライ対象エラー | - |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | なし |
| 1日あたり上限 | なし |

### 配信時間帯

制限なし（sp_BlitzFirst実行時に即時出力）

## セキュリティ考慮事項

- 本通知には機密情報は含まれない
- URLはHTTPで提供されているが、公開情報へのリンクのみ

## 備考

- sp_BlitzWhoはFirst Responder Kitの一部として提供される独立したストアドプロシージャ
- sp_BlitzFirstの開始時（BlitzWho_Start）と終了時（BlitzWho_End）の2回チェックされる可能性がある
- メッセージ内の「database_files」は誤記と思われるが、ソースコードのまま記載

---

## コードリーディングガイド

本通知を理解するために参照すべきファイルと、推奨する読み解き順序を以下に示す。

### 推奨読解順序

#### Step 1: エントリーポイントを理解する

sp_BlitzFirstストアドプロシージャの構造と、sp_BlitzWhoチェックが行われる箇所を特定する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_BlitzFirst.sql | `sp_BlitzFirst.sql` | メインのストアドプロシージャ定義、パラメータ構成を理解 |

**主要処理フロー**:
1. **行283-293**: BlitzWho_Start結果セット出力条件チェックとsp_BlitzWho存在確認
2. **行285-286**: OBJECT_ID関数によるsp_BlitzWho存在チェック（master.dboと現在DB）
3. **行287**: 未インストール時のPRINT文出力
4. **行5133-5142**: BlitzWho_End結果セット出力条件チェック（終了時の同一ロジック）

**読解のコツ**: sp_BlitzFirstは5000行以上の大規模なストアドプロシージャ。BlitzWhoチェックは開始時と終了時の2箇所で行われる。

#### Step 2: 条件分岐ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_BlitzFirst.sql | `sp_BlitzFirst.sql` | IF条件の各パラメータの意味を理解 |

**主要処理フロー**:
- **@SinceStartup**: 0の場合はリアルタイム診断、1の場合はサーバー起動時からの統計
- **@Seconds**: サンプリング期間（秒）、0より大きい場合にBlitzWhoが意味を持つ
- **@ExpertMode**: 1で詳細モード、BlitzWho呼び出しを有効化
- **@OutputResultSets**: 出力する結果セットをカンマ区切りで指定

### プログラム呼び出し階層図

```
sp_BlitzFirst (エントリーポイント)
    │
    ├─ [条件チェック] @SinceStartup, @Seconds, @ExpertMode, @OutputType, @OutputResultSets
    │
    ├─ [存在チェック] OBJECT_ID('master.dbo.sp_BlitzWho')
    │      └─ NULL: 未インストール
    │
    ├─ [存在チェック] OBJECT_ID('dbo.sp_BlitzWho')
    │      └─ NULL: 未インストール
    │
    ├─ [両方NULL] PRINT 警告メッセージ出力
    │
    └─ [いずれか存在] EXEC (@BlitzWho) 実行
```

### データフロー図

```
[入力]                    [処理]                         [出力]

@SinceStartup ──────┐
@Seconds ───────────┼─▶ [条件評価] ──────▶ チェック実行判定
@ExpertMode ────────┤
@OutputType ────────┤
@OutputResultSets ──┘

                         [OBJECT_ID]
master.dbo.sp_BlitzWho ──┬─▶ 存在チェック
dbo.sp_BlitzWho ─────────┘
                              │
                              ▼
                    ┌─────────┴──────────┐
                    │                    │
                    ▼                    ▼
              [存在する]           [存在しない]
                    │                    │
                    ▼                    ▼
           sp_BlitzWho実行        PRINT警告出力
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| sp_BlitzFirst.sql | `sp_BlitzFirst.sql` | ソース | 本通知を発生させるメインプロシージャ |
| sp_BlitzWho.sql | `sp_BlitzWho.sql` | ソース | インストールが推奨される関連プロシージャ |
| Install-All-Scripts.sql | `Install-All-Scripts.sql` | ソース | 全スクリプト一括インストール（行37199-37209にも同一ロジック） |
| Install-Azure.sql | `Install-Azure.sql` | ソース | Azure向けインストール（行9340-9350にも同一ロジック） |
