# 帳票設計書 1-sp_Blitz

## 概要

本ドキュメントは、SQL Server First Responder Kitのsp_Blitzストアドプロシージャが出力するサーバー診断帳票の設計を記述する。

### 本帳票の処理概要

sp_Blitzは、SQL Serverの全体的なヘルスチェックを行い、優先度付きの問題リストを出力するストアドプロシージャである。サーバー構成、データベース設定、パフォーマンス、セキュリティなど200以上のチェック項目を分析し、発見された問題を優先度順に分類して報告する。

**業務上の目的・背景**：SQL Serverの運用において、設定ミス、パフォーマンス問題、セキュリティリスクなどを早期に発見することは、システムの安定稼働とデータ保護に不可欠である。本帳票は、DBAやシステム管理者が定期的なヘルスチェックを効率的に実施し、潜在的な問題を未然に防ぐことを目的としている。

**帳票の利用シーン**：
- SQL Server導入後の初期設定確認
- 定期的なサーバーヘルスチェック（日次・週次・月次）
- パフォーマンス問題発生時の原因調査
- セキュリティ監査前の事前確認
- サーバー移行・アップグレード前後の設定比較

**主要な出力内容**：
1. Priority（優先度）：問題の緊急度を示す数値（1が最も緊急）
2. FindingsGroup（検出グループ）：問題のカテゴリ分類
3. Finding（検出内容）：具体的な問題の説明
4. DatabaseName（データベース名）：問題が関連するデータベース
5. URL（詳細URL）：問題の詳細情報へのリンク
6. Details（詳細）：問題の具体的な内容と影響
7. QueryPlan（実行プラン）：関連するクエリの実行プラン
8. CheckID（チェックID）：各チェック項目の識別番号

**帳票の出力タイミング**：
- ストアドプロシージャ `EXEC sp_Blitz` の手動実行時
- SQL Server Agentジョブによる定期実行時
- 監視ツールからの自動呼び出し時

**帳票の利用者**：
- データベース管理者（DBA）
- システム管理者
- インフラエンジニア
- セキュリティ監査担当者

## 帳票種別

診断レポート / 問題一覧表

## 利用画面

| 画面No | 画面名 | URL/ルーティング | 出力操作 |
|--------|--------|-----------------|---------|
| N/A | SQL Server Management Studio | N/A | `EXEC sp_Blitz` 実行 |
| N/A | Azure Data Studio | N/A | `EXEC sp_Blitz` 実行 |
| N/A | コマンドライン | sqlcmd | スクリプト実行 |

## 出力形式

### 基本仕様

| 項目 | 内容 |
|-----|------|
| ファイル形式 | TABLE / COUNT / MARKDOWN / SCHEMA / XML / NONE |
| 用紙サイズ | N/A（結果セットとして出力） |
| 向き | N/A |
| ファイル名 | N/A（テーブル出力時は@OutputTableName指定） |
| 出力方法 | 結果セット返却 / テーブル書き込み |
| 文字コード | NVARCHAR（Unicode） |

### 出力タイプ別設定

| OutputType | 説明 |
|------------|------|
| TABLE | 標準的な結果セットとして出力（デフォルト） |
| COUNT | 発見された問題の件数のみ出力 |
| MARKDOWN | Markdownフォーマットでの箇条書き出力 |
| SCHEMA | スキーマ情報（フィールド一覧）のみ出力 |
| XML | XML形式での出力 |
| NONE | 結果を返さずテーブルに書き込みのみ |

## 帳票レイアウト

### レイアウト概要

結果セットは優先度順にソートされた問題一覧として出力される。各行は1つの検出事項を表す。

```
┌─────────────────────────────────────────────────────────────────────┐
│  結果セット（問題一覧）                                              │
├─────────────────────────────────────────────────────────────────────┤
│  Priority | FindingsGroup | Finding | DatabaseName | URL | Details │
│  -------- | ------------- | ------- | ------------ | --- | ------- │
│     1     | Corruption    | ...     | master       | ... | ...     │
│    10     | Performance   | ...     | UserDB       | ... | ...     │
│    50     | Reliability   | ...     | NULL         | ... | ...     │
│   ...     | ...           | ...     | ...          | ... | ...     │
└─────────────────────────────────────────────────────────────────────┘
```

### 出力カラム詳細

| No | 項目名 | 説明 | データ型 | 表示形式 |
|----|-------|------|----------|---------|
| 1 | Priority | 問題の優先度（1-255） | TINYINT | 数値 |
| 2 | FindingsGroup | 検出カテゴリ | VARCHAR(50) | テキスト |
| 3 | Finding | 検出内容 | VARCHAR(200) | テキスト |
| 4 | DatabaseName | 関連データベース名 | NVARCHAR(128) | テキスト |
| 5 | URL | 詳細情報URL | VARCHAR(200) | ハイパーリンク |
| 6 | Details | 詳細説明 | NVARCHAR(4000) | テキスト |
| 7 | QueryPlan | 実行プラン | XML/NVARCHAR(MAX) | XML |
| 8 | QueryPlanFiltered | フィルタ済み実行プラン | NVARCHAR(MAX) | テキスト |
| 9 | CheckID | チェック項目ID | INT | 数値 |

## 出力条件

### 入力パラメータ

| パラメータ名 | データ型 | デフォルト値 | 説明 |
|-------------|----------|-------------|------|
| @Help | TINYINT | 0 | 1でヘルプ表示 |
| @CheckUserDatabaseObjects | TINYINT | 1 | ユーザーDBオブジェクトのチェック |
| @CheckProcedureCache | TINYINT | 0 | プロシージャキャッシュのチェック |
| @OutputType | VARCHAR(20) | 'TABLE' | 出力形式 |
| @CheckServerInfo | TINYINT | 0 | サーバー情報の表示 |
| @IgnorePrioritiesBelow | INT | NULL | 指定優先度未満を除外 |
| @IgnorePrioritiesAbove | INT | NULL | 指定優先度超を除外 |
| @OutputServerName | NVARCHAR(256) | NULL | 出力先サーバー名 |
| @OutputDatabaseName | NVARCHAR(256) | NULL | 出力先DB名 |
| @OutputSchemaName | NVARCHAR(256) | NULL | 出力先スキーマ名 |
| @OutputTableName | NVARCHAR(256) | NULL | 出力先テーブル名 |
| @BringThePain | TINYINT | 0 | 詳細チェック有効化 |
| @Debug | TINYINT | 0 | デバッグモード |

### ソート順

| 優先度 | 項目 | 昇順/降順 |
|-------|------|---------|
| 1 | Priority | 昇順 |
| 2 | FindingsGroup | 昇順 |
| 3 | Finding | 昇順 |
| 4 | DatabaseName | 昇順 |
| 5 | Details | 昇順 |

### 改ページ条件

結果セットのため改ページなし。出力先によりクライアント側で制御。

## データベース参照仕様

### 参照テーブル一覧

| テーブル名 | 用途 | 結合条件 |
|-----------|------|---------|
| sys.configurations | サーバー構成の確認 | - |
| sys.databases | データベース設定の確認 | - |
| sys.dm_os_sys_info | OSレベル情報の取得 | - |
| sys.dm_exec_query_stats | クエリ統計情報 | - |
| sys.dm_os_wait_stats | 待機統計情報 | - |
| msdb.dbo.sysjobs | Agentジョブ情報 | - |
| msdb.dbo.backupset | バックアップ履歴 | - |
| master.sys.traces | トレース情報 | - |

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

#### sys.configurations

| 参照項目（カラム名） | 帳票項目との対応 | 取得条件 | 備考 |
|-------------------|----------------|---------|------|
| name | Finding | - | 構成名 |
| value | Details | - | 設定値 |
| value_in_use | Details | - | 実行中の値 |

#### sys.databases

| 参照項目（カラム名） | 帳票項目との対応 | 取得条件 | 備考 |
|-------------------|----------------|---------|------|
| name | DatabaseName | - | データベース名 |
| recovery_model_desc | Details | - | 復旧モデル |
| collation_name | Details | - | 照合順序 |
| is_auto_shrink_on | Details | - | 自動縮小設定 |

## 計算仕様

### 計算項目一覧

| 項目名 | 計算式 | 端数処理 | 備考 |
|-------|-------|---------|------|
| Priority | チェック項目ごとに定義済み | - | 1-255の範囲 |
| DaysUptime | DATEDIFF(HOUR, create_date, GETDATE()) / 24.0 | 小数点以下2桁 | tempdb(database_id=2)の作成日時から算出 |

## 処理フロー

### 出力フロー

```mermaid
flowchart TD
    A[sp_Blitz実行] --> B{@Help = 1?}
    B -->|Yes| C[ヘルプ表示して終了]
    B -->|No| D{@OutputType = SCHEMA?}
    D -->|Yes| E[スキーマ情報出力]
    D -->|No| F[#BlitzResults一時テーブル作成]
    F --> G[権限チェック]
    G --> H[各種チェック実行]
    H --> I[サーバー構成チェック]
    H --> J[データベース設定チェック]
    H --> K[パフォーマンスチェック]
    H --> L[セキュリティチェック]
    I --> M[結果をBlitzResultsに挿入]
    J --> M
    K --> M
    L --> M
    M --> N{@OutputTableName指定?}
    N -->|Yes| O[指定テーブルに出力]
    N -->|No| P{@OutputType判定}
    P -->|TABLE| Q[結果セット返却]
    P -->|MARKDOWN| R[Markdown形式で出力]
    P -->|COUNT| S[件数のみ返却]
    P -->|XML| T[XML形式で出力]
    O --> U[終了]
    Q --> U
    R --> U
    S --> U
    T --> U
```

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 表示メッセージ | 対処方法 |
|----------|---------|--------------|---------|
| 権限不足 | VIEW SERVER STATE権限がない | The user does not have VIEW SERVER STATE permissions | 適切な権限を付与 |
| データベース不存在 | 出力先DBが存在しない | 出力時エラー | 出力先DBを事前作成 |
| バージョン非対応 | SQL Server 2005以前 | Sorry, 2005 and 2000 | サポートバージョンへアップグレード |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定データ件数 | 0〜500件（環境により変動） |
| 目標出力時間 | 30秒以内（標準構成） |
| 同時出力数上限 | 制限なし（サーバーリソース依存） |

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

- VIEW SERVER STATE権限が必要
- sysadmin権限があれば全チェック実行可能
- 非sysadminユーザーは一部チェックがスキップされる
- セキュリティ関連の検出結果はMARKDOWN出力から除外される
- 出力テーブルへのアクセス権限は別途管理が必要

## 備考

- バージョン: 8.29（2026年2月3日リリース）
- ライセンス: MIT License
- 公式サイト: http://FirstResponderKit.org
- GitHub: https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/

---

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

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

### 推奨読解順序

#### Step 1: データ構造を理解する

まず、出力結果を格納する一時テーブルの構造を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_Blitz.sql | `sp_Blitz.sql` | 行480-494: #BlitzResults一時テーブルの定義を確認 |

**読解のコツ**: T-SQLのCREATE TABLE文でカラム定義を確認し、各カラムの型と用途を把握する。

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

処理の起点となるストアドプロシージャのシグネチャとパラメータを確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_Blitz.sql | `sp_Blitz.sql` | 行5-35: ALTER PROCEDUREとパラメータ定義 |

**主要処理フロー**:
1. **行42**: バージョン情報の設定
2. **行50-122**: @Help=1の場合のヘルプ出力
3. **行124-128**: @OutputType='SCHEMA'の場合のスキーマ出力
4. **行260-435**: 権限チェック処理
5. **行480-494**: #BlitzResults一時テーブル作成

#### Step 3: チェック処理の実装を理解する

各チェック項目がどのように実装されているかを確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sp_Blitz.sql | `sp_Blitz.sql` | 行9000以降: 個別チェック処理の実装パターン |

**主要処理フロー**:
- **行9017-9049**: CheckID 77の実装例（Database Snapshot Online）
- **行9051-9095**: CheckID 79の実装例（Shrink Database Job）
- 各チェックは `IF NOT EXISTS (SELECT 1 FROM #SkipChecks WHERE CheckID = ...)` でスキップ判定

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

```
sp_Blitz (エントリーポイント)
    │
    ├─ ヘルプ表示 (@Help = 1)
    │      └─ PRINT文でヘルプテキスト出力
    │
    ├─ スキーマ出力 (@OutputType = 'SCHEMA')
    │      └─ SELECT FieldList
    │
    └─ メイン処理
           ├─ 権限チェック
           │      ├─ sysadmin判定
           │      └─ 各種権限確認（VIEW SERVER STATE等）
           │
           ├─ 一時テーブル作成
           │      ├─ #BlitzResults
           │      ├─ #TemporaryDatabaseResults
           │      └─ #SkipChecks
           │
           ├─ チェック処理実行（200以上のCheckID）
           │      ├─ サーバー構成チェック
           │      ├─ データベース設定チェック
           │      ├─ パフォーマンスチェック
           │      └─ セキュリティチェック
           │
           └─ 結果出力
                  ├─ TABLE形式
                  ├─ MARKDOWN形式
                  ├─ COUNT形式
                  └─ テーブル書き込み
```

### データフロー図

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

パラメータ指定 ──────▶ sp_Blitz ──────▶ #BlitzResults
                          │                    │
sys.configurations ◀──────┤                    ├──▶ 結果セット (TABLE)
sys.databases ◀───────────┤                    │
sys.dm_os_sys_info ◀──────┤                    ├──▶ Markdown出力
msdb.dbo.sysjobs ◀────────┤                    │
msdb.dbo.backupset ◀──────┘                    └──▶ 出力テーブル
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| sp_Blitz.sql | `sp_Blitz.sql` | ソース | メインストアドプロシージャ |
| Install-All-Scripts.sql | `Install-All-Scripts.sql` | スクリプト | 全スクリプトのインストール |
| Uninstall.sql | `Uninstall.sql` | スクリプト | アンインストール用 |
