# 機能設計書 1-sp_Blitz

## 概要

本ドキュメントは、SQL Server First Responder Kitのsp_Blitzストアドプロシージャの機能設計について記載する。sp_BlitzはSQL Serverの全体的なヘルスチェックを実行し、優先度付きの問題リストを出力する診断ツールである。

### 本機能の処理概要

sp_Blitzは、SQL Serverインスタンス全体の健全性を包括的に診断し、検出された問題を優先度順にリスト化して出力するストアドプロシージャである。

**業務上の目的・背景**：データベース管理者（DBA）がSQL Serverの問題を迅速に特定し、対処優先度を判断するために必要な機能である。日次・週次の定期チェックや、パフォーマンス問題発生時のトラブルシューティングにおいて、サーバー全体の状態を俯瞰的に把握することで、効率的な問題解決を支援する。

**機能の利用シーン**：
- 新規SQL Serverインスタンスの初期診断
- 定期的なヘルスチェック（日次/週次）
- パフォーマンス問題発生時の原因調査
- セキュリティ監査の事前チェック
- SQL Server構成の妥当性確認

**主要な処理内容**：
1. サーバー構成の検証（メモリ、CPU、バージョン情報）
2. データベース設定の診断（復旧モデル、互換性レベル）
3. バックアップ状況の確認（フル/差分/ログバックアップ）
4. セキュリティ設定の検証（権限、認証モード）
5. パフォーマンス関連設定の診断（インデックス、統計情報）
6. SQL Agentジョブ・アラートの設定確認
7. 待機統計（Wait Stats）の分析
8. プランキャッシュの検証（オプション）

**関連システム・外部連携**：
- sys.dm_*動的管理ビュー（DMV）へのアクセス
- DBCC コマンドの実行（DBINFO、LOGINFO等）
- msdbデータベースのジョブ・アラート情報
- システムヘルスセッションのデータ

**権限による制御**：
- sysadmin権限がない場合、一部のチェックがスキップされる（CheckID 223で通知）
- VIEW SERVER STATE権限は必須
- 特定のチェックにはALTER TRACE、EXECUTE権限が必要

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | sp_Blitz 結果画面 | 主機能 | サーバー全体のヘルスチェックを実行し、Priority/FindingsGroup/Findings等の結果を表示 |

## 機能種別

計算処理 / データ分析 / 診断レポート出力

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| @Help | TINYINT | No | ヘルプ情報の表示（1=表示） | 0または1 |
| @CheckUserDatabaseObjects | TINYINT | No | ユーザーデータベースオブジェクトのチェック | デフォルト1 |
| @CheckProcedureCache | TINYINT | No | プロシージャキャッシュのチェック | デフォルト0 |
| @OutputType | VARCHAR(20) | No | 出力形式（TABLE/COUNT/MARKDOWN/SCHEMA/XML/NONE） | デフォルトTABLE |
| @OutputProcedureCache | TINYINT | No | プロシージャキャッシュの出力 | デフォルト0 |
| @CheckProcedureCacheFilter | VARCHAR(10) | No | キャッシュフィルタ（CPU/Reads/Duration/ExecCount） | NULL許可 |
| @CheckServerInfo | TINYINT | No | サーバー情報のチェック | デフォルト0 |
| @SkipChecksServer | NVARCHAR(256) | No | スキップチェックのサーバー名 | NULL許可 |
| @SkipChecksDatabase | NVARCHAR(256) | No | スキップチェックのデータベース名 | NULL許可 |
| @SkipChecksSchema | NVARCHAR(256) | No | スキップチェックのスキーマ名 | NULL許可 |
| @SkipChecksTable | NVARCHAR(256) | No | スキップチェックのテーブル名 | NULL許可 |
| @IgnorePrioritiesBelow | INT | No | 指定優先度以下を無視 | NULL許可 |
| @IgnorePrioritiesAbove | INT | No | 指定優先度以上を無視 | NULL許可 |
| @OutputServerName | NVARCHAR(256) | No | 出力先サーバー名 | NULL許可 |
| @OutputDatabaseName | NVARCHAR(256) | No | 出力先データベース名 | NULL許可 |
| @OutputSchemaName | NVARCHAR(256) | No | 出力先スキーマ名 | NULL許可 |
| @OutputTableName | NVARCHAR(256) | No | 出力先テーブル名 | NULL許可 |
| @OutputXMLasNVARCHAR | TINYINT | No | XMLをNVARCHARとして出力 | デフォルト0 |
| @EmailRecipients | VARCHAR(MAX) | No | メール送信先 | NULL許可 |
| @EmailProfile | sysname | No | メールプロファイル | NULL許可 |
| @SummaryMode | TINYINT | No | サマリーモード | デフォルト0 |
| @BringThePain | TINYINT | No | 大量データベース時の強制実行 | デフォルト0 |
| @UsualDBOwner | sysname | No | 通常のDBオーナー | NULL許可 |
| @UsualOwnerOfJobs | sysname | No | ジョブの通常オーナー | NULL許可 |
| @SkipBlockingChecks | TINYINT | No | ブロッキングチェックのスキップ | デフォルト1 |
| @Debug | TINYINT | No | デバッグモード（0/1/2） | デフォルト0 |
| @Version | VARCHAR(30) | No | バージョン（OUTPUT） | 出力専用 |
| @VersionDate | DATETIME | No | バージョン日付（OUTPUT） | 出力専用 |
| @VersionCheckMode | BIT | No | バージョンチェックモード | デフォルト0 |

### 入力データソース

- sys.databases: データベース一覧と設定
- sys.configurations: サーバー構成設定
- sys.dm_os_wait_stats: 待機統計
- sys.dm_exec_query_stats: クエリ統計
- msdb.dbo.backupset: バックアップ履歴
- msdb.dbo.sysjobs: SQLエージェントジョブ
- msdb.dbo.sysalerts: SQLエージェントアラート
- DBCC DBINFO: データベース内部情報
- DBCC LOGINFO: トランザクションログ情報

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| Priority | TINYINT | 問題の優先度（1が最高） |
| FindingsGroup | VARCHAR(50) | 問題のカテゴリ |
| Finding | VARCHAR(200) | 問題の名称 |
| DatabaseName | NVARCHAR(128) | 関連データベース名 |
| URL | VARCHAR(200) | 詳細情報へのリンク |
| Details | NVARCHAR(4000) | 問題の詳細説明 |
| QueryPlan | XML/NVARCHAR(MAX) | 関連クエリプラン |
| QueryPlanFiltered | NVARCHAR(MAX) | フィルタリングされたクエリプラン |
| CheckID | INT | チェック項目のID |

### 出力先

- 画面表示（デフォルト）
- 指定テーブルへの出力（@OutputTableName指定時）
- メール送信（@EmailRecipients指定時）
- XML/MARKDOWN/CSV形式

## 処理フロー

### 処理シーケンス

```
1. パラメータ検証と初期化
   └─ バージョン情報設定、権限チェック、一時テーブル作成

2. スキップチェック設定の読み込み
   └─ #SkipChecksテーブルへの条件設定

3. 環境固有のスキップ設定
   └─ RDS/Express/Azure MI検出時の自動スキップ

4. DBCC DBINFO実行（チェック2,68用）
   └─ 各データベースのDBCC情報収集

5. 各種チェックの実行（200以上のチェック項目）
   └─ サーバー設定、DB設定、セキュリティ、パフォーマンス等

6. 結果の集約と出力
   └─ #BlitzResultsから結果セット生成
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{@Help = 1?}
    B -->|Yes| C[ヘルプ出力]
    C --> Z[終了]
    B -->|No| D{@VersionCheckMode = 1?}
    D -->|Yes| Z
    D -->|No| E[パラメータ初期化]
    E --> F[権限チェック]
    F --> G{sysadmin?}
    G -->|No| H[一部チェックスキップ設定]
    G -->|Yes| I[フルチェック準備]
    H --> J[スキップチェック読み込み]
    I --> J
    J --> K[環境検出とスキップ設定]
    K --> L[DBCC DBINFO実行]
    L --> M[各種チェック実行]
    M --> N[結果集約]
    N --> O{@OutputTableName?}
    O -->|Yes| P[テーブル出力]
    O -->|No| Q[結果セット出力]
    P --> Z
    Q --> Z
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | 優先度分類 | 問題は優先度1（最高）から254（情報）まで分類される | 全チェック結果 |
| BR-002 | 50DB制限 | 50以上のDBがある場合、@BringThePain=1が必要 | @CheckUserDatabaseObjects=1時 |
| BR-003 | 互換性制限 | 互換性レベル90未満のDBがある場合、CTE使用チェックをスキップ | @CheckUserDatabaseObjects=1時 |
| BR-004 | RDSスキップ | Amazon RDS検出時、非対応チェックを自動スキップ | RDS環境検出時 |
| BR-005 | 権限スキップ | sysadmin以外の場合、権限必要なチェックをスキップ | 非sysadminユーザー |

### 計算ロジック

**待機統計クリアタイム計算**:
```sql
@MsSinceWaitsCleared = DATEDIFF(MINUTE, create_date, CURRENT_TIMESTAMP) * 60000.0
-- tempdbの作成日時からの経過ミリ秒
```

**CPU時間計算**:
```sql
@CpuMsSinceWaitsCleared = @MsSinceWaitsCleared * scheduler_count
-- スケジューラ数を乗じた総CPU時間
```

## データベース操作仕様

### 操作別データベース影響一覧

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 参照 | sys.databases | SELECT | データベース一覧取得 |
| 参照 | sys.configurations | SELECT | サーバー構成取得 |
| 参照 | sys.dm_os_wait_stats | SELECT | 待機統計取得 |
| 参照 | msdb.dbo.backupset | SELECT | バックアップ履歴取得 |
| 参照 | msdb.dbo.sysjobs | SELECT | ジョブ情報取得 |
| 挿入 | 出力テーブル | INSERT | 結果出力（オプション） |

### テーブル別操作詳細

#### #BlitzResults（一時テーブル）

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| INSERT | CheckID, Priority, FindingsGroup, Finding, URL, Details | 各チェック結果 | チェック毎に挿入 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 権限エラー | VIEW SERVER STATE権限なし | RAISERROR後にRETURN |
| - | バージョンエラー | SQL Server 2005/2000 | 非対応メッセージ出力 |
| - | データベースエラー | オフラインDB存在 | 2回目実行で解決 |

### リトライ仕様

特定のリトライ機能は実装されていない。オフラインデータベースによるエラーは、2回目の実行で解決する場合がある。

## トランザクション仕様

READ UNCOMMITTED分離レベルで実行される。診断目的のため、トランザクションロックを最小化している。

## パフォーマンス要件

- 通常実行: 数秒から数十秒（データベース数に依存）
- @CheckUserDatabaseObjects=1: データベース数とオブジェクト数に比例して増加
- @BringThePain=1: 50以上のDBでの実行時に必要

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

- VIEW SERVER STATE権限が必須
- sysadmin権限がない場合、一部チェックは自動スキップ
- セキュリティ関連の問題（CheckID 21, 55等）は権限に応じて検出
- 出力テーブルへの書き込み時は適切な権限が必要

## 備考

- バージョン: 8.29（2026年2月3日時点）
- MITライセンスで提供
- First Responder Kit（http://FirstResponderKit.org）の一部

---

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

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

### 推奨読解順序

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

まず、プログラムで使用される一時テーブルの構造を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_Blitz.sql | `sp_Blitz.sql` | **480-494行目**: #BlitzResults一時テーブルの構造 |
| 1-2 | sp_Blitz.sql | `sp_Blitz.sql` | **558-566行目**: #SkipChecks一時テーブルの構造 |

**読解のコツ**: 一時テーブル#BlitzResultsがチェック結果の格納先であり、最終的にこのテーブルの内容が出力される。CheckID、Priority、FindingsGroup、Finding、Detailsの各カラムの役割を理解することが重要。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_Blitz.sql | `sp_Blitz.sql` | **5-35行目**: ALTER PROCEDURE定義とパラメータ一覧 |
| 2-2 | sp_Blitz.sql | `sp_Blitz.sql` | **37-48行目**: 初期設定とバージョンチェック |

**主要処理フロー**:
1. **37-39行目**: SET NOCOUNT ON、STATISTICS XML OFF、READ UNCOMMITTED設定
2. **42行目**: バージョン情報の設定（@Version = '8.29'）
3. **45-48行目**: @VersionCheckMode = 1の場合は即座にRETURN
4. **50-122行目**: @Help = 1の場合のヘルプ出力

#### Step 3: 権限チェック処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sp_Blitz.sql | `sp_Blitz.sql` | **260-435行目**: 権限チェックとスキップ設定 |

**主要処理フロー**:
- **260-270行目**: sysadmin権限チェック
- **275-285行目**: VIEW SERVER STATE権限チェック（必須）
- **287-435行目**: 各種権限に基づくスキップフラグ設定

#### Step 4: スキップチェック処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | sp_Blitz.sql | `sp_Blitz.sql` | **545-716行目**: スキップチェック設定 |
| 4-2 | sp_Blitz.sql | `sp_Blitz.sql` | **780-904行目**: 環境固有のスキップ設定（RDS/Express/MI） |

**主要処理フロー**:
- **568-574行目**: 管理用DBのスキップ（DBAtools等）
- **782-833行目**: Amazon RDS環境検出とスキップ
- **836-857行目**: Express Edition検出とスキップ
- **860-904行目**: Azure Managed Instance検出とスキップ

#### Step 5: 各種チェック処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | sp_Blitz.sql | `sp_Blitz.sql` | **1269-1293行目**: DBCC DBINFO実行 |

**主要処理フロー**:
- **1284-1292行目**: sp_MSforeachdbを使用して全DBのDBCC DBINFO実行

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

```
sp_Blitz
    │
    ├─ fn_my_permissions (権限チェック)
    │
    ├─ sp_validatelogins (無効ログインチェック)
    │
    ├─ sp_MSforeachdb (各DBへのDBCC実行)
    │      └─ DBCC DBINFO
    │      └─ DBCC LOGINFO
    │
    ├─ sys.dm_* (動的管理ビュー参照)
    │      ├─ dm_os_wait_stats
    │      ├─ dm_exec_query_stats
    │      └─ dm_os_sys_info
    │
    └─ sp_executesql (動的SQL実行)
```

### データフロー図

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

パラメータ ──────────────────▶ パラメータ検証 ─────────────────▶ #BlitzResults
   │                              │                                   │
   │                              ▼                                   │
sys.databases ───────────────▶ データベース診断 ─────────────────▶ │
   │                              │                                   │
sys.configurations ──────────▶ サーバー設定診断 ─────────────────▶ │
   │                              │                                   │
sys.dm_os_wait_stats ────────▶ 待機統計分析 ─────────────────────▶ │
   │                              │                                   │
msdb.dbo.backupset ──────────▶ バックアップ診断 ─────────────────▶ │
   │                              │                                   │
msdb.dbo.sysjobs ────────────▶ ジョブ/アラート診断 ──────────────▶ │
                                  │                                   │
                                  ▼                                   │
                            結果集約 ◀────────────────────────────────┘
                                  │
                                  ▼
                         [結果セット/テーブル/メール]
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| sp_Blitz.sql | `sp_Blitz.sql` | ソース | メインストアドプロシージャ定義 |
| Install-All-Scripts.sql | `Install-All-Scripts.sql` | インストール | 一括インストールスクリプト |
| Install-Azure.sql | `Install-Azure.sql` | インストール | Azure用インストールスクリプト |
| Uninstall.sql | `Uninstall.sql` | アンインストール | 削除スクリプト |
