# バッチ設計書 1-sp_Blitz

## 概要

本ドキュメントは、SQL Server First Responder Kitに含まれるsp_Blitzストアドプロシージャのバッチ設計書です。sp_BlitzはSQL Serverの健全性チェックを実行し、優先度付きの修正すべき問題リストを提供する診断ツールです。

### 本バッチの処理概要

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

**業務上の目的・背景**：SQL Serverの運用において、パフォーマンス問題やセキュリティリスク、設定ミスなどを早期に発見することは非常に重要です。sp_Blitzは、DBAが手動で確認すべき数百項目のベストプラクティスチェックを自動化し、優先度付きの「To-Doリスト」として提供することで、効率的なサーバー管理を支援します。

**バッチの実行タイミング**：随時実行（手動）。定期的な健全性チェックとして日次または週次でスケジュール実行することも推奨されます。sp_BlitzFirstと組み合わせてテーブルに出力を保存し、継続的な監視に使用することも可能です。

**主要な処理内容**：
1. SQL Serverインスタンスの基本情報収集（バージョン、エディション、起動時間など）
2. データベース設定のチェック（復旧モデル、自動縮小、自動統計更新など）
3. セキュリティ設定の確認（saアカウント、ログイン権限、xp_cmdshellなど）
4. パフォーマンス関連の診断（待機統計、プランキャッシュ、インデックス問題など）
5. バックアップ状況の確認
6. SQL Server Agent ジョブの確認
7. 結果の優先度付けと出力

**前後の処理との関連**：sp_Blitzは単体で実行可能ですが、より詳細な診断のためにsp_BlitzCache、sp_BlitzIndex、sp_BlitzFirstなどと組み合わせて使用されることが多いです。sp_Blitzの結果から特定の問題領域を深掘りする際に他のsp_Blitz系プロシージャが活用されます。

**影響範囲**：読み取り専用の診断ツールであり、データベースやサーバー設定を変更しません。ただし、@CheckUserDatabaseObjects=1の場合、ユーザーデータベースのオブジェクト情報を読み取るため、大規模環境では実行時間が長くなる可能性があります。

## バッチ種別

診断・分析

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 随時/日次/週次 |
| 実行時刻 | 任意（業務影響の少ない時間帯推奨） |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | 手動/スケジュール |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| SQL Serverバージョン | SQL Server 2008以降（2005/2000は非対応） |
| 必要権限 | VIEW SERVER STATE権限が最低限必要。sysadminロールがあればすべてのチェックが実行可能 |
| 依存オブジェクト | なし（単体で動作可能） |

### 実行可否判定

- VIEW SERVER STATE権限がない場合、プロシージャは即座にエラーを返して終了する
- sysadmin以外の場合、一部のチェック（DBCCコマンド、トレースファイル読み取りなど）はスキップされる

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| @Help | TINYINT | No | 0 | 1を指定するとヘルプメッセージを表示 |
| @CheckUserDatabaseObjects | TINYINT | No | 1 | ユーザーデータベースのオブジェクト（トリガー、ヒープなど）をチェックするか |
| @CheckProcedureCache | TINYINT | No | 0 | プロシージャキャッシュのトップ20-50をチェックするか |
| @OutputType | VARCHAR(20) | No | 'TABLE' | 出力形式（TABLE/COUNT/MARKDOWN/SCHEMA/XML/NONE） |
| @OutputProcedureCache | TINYINT | No | 0 | プロシージャキャッシュの結果を出力に含めるか |
| @CheckProcedureCacheFilter | VARCHAR(10) | No | NULL | プロシージャキャッシュのフィルタ（CPU/Reads/Duration/ExecCount） |
| @CheckServerInfo | TINYINT | No | 0 | サーバー情報（CPU、メモリ、仮想化）を表示するか |
| @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 | 0 | XMLをNVARCHARとして出力するか |
| @EmailRecipients | VARCHAR(MAX) | No | NULL | メール送信先 |
| @EmailProfile | sysname | No | NULL | メールプロファイル名 |
| @SummaryMode | TINYINT | No | 0 | サマリーモードで実行するか |
| @BringThePain | TINYINT | No | 0 | 追加の詳細チェックを実行するか |
| @UsualDBOwner | sysname | No | NULL | 通常のデータベース所有者 |
| @UsualOwnerOfJobs | sysname | No | NULL | 通常のジョブ所有者 |
| @SkipBlockingChecks | TINYINT | No | 1 | ブロッキングチェックをスキップするか |
| @Debug | TINYINT | No | 0 | デバッグモード（0=無効/1=ステップメッセージ/2=動的クエリ出力） |
| @Version | VARCHAR(30) | No | NULL | バージョン番号（OUTPUT） |
| @VersionDate | DATETIME | No | NULL | バージョン日付（OUTPUT） |
| @VersionCheckMode | BIT | No | 0 | バージョンチェックモード |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| sys.databases | システムビュー | データベース情報 |
| sys.configurations | システムビュー | サーバー構成設定 |
| sys.dm_os_wait_stats | DMV | 待機統計 |
| sys.dm_exec_query_stats | DMV | クエリ統計 |
| msdb.dbo.backupset | テーブル | バックアップ履歴 |
| msdb.dbo.sysjobs | テーブル | SQL Agent ジョブ情報 |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| 結果セット | TABLE | 優先度付きの問題リスト |
| 指定テーブル | DB | @OutputTableName指定時に永続化 |
| メール | 電子メール | @EmailRecipients指定時に送信 |

### 出力ファイル仕様

| 項目 | 内容 |
|-----|------|
| ファイル名 | 該当なし（テーブル出力） |
| 出力先 | @OutputDatabaseName.@OutputSchemaName.@OutputTableName |
| 文字コード | UTF-16（SQL Server標準） |
| 区切り文字 | 該当なし |

出力結果のスキーマ:
- 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

## 処理フロー

### 処理シーケンス

```
1. パラメータ検証とセッション設定
   └─ NOCOUNT ON、READ UNCOMMITTED分離レベル設定
2. 権限チェック
   └─ VIEW SERVER STATE権限の確認、sysadmin判定
3. 一時テーブル作成
   └─ #BlitzResults、#TemporaryDatabaseResultsなど
4. サーバー基本情報収集
   └─ 起動時間、バージョン、エディションの取得
5. 各種チェックの実行（CheckID別）
   └─ セキュリティ、構成、パフォーマンス、バックアップなど
6. 結果の集約と優先度付け
   └─ #BlitzResultsへの挿入
7. 出力処理
   └─ TABLE/MARKDOWN/XML等の形式で出力
8. クリーンアップ
   └─ 一時テーブルの削除
```

### フローチャート

```mermaid
flowchart TD
    A[バッチ開始] --> B[パラメータ検証]
    B --> C{権限チェック}
    C -->|VIEW SERVER STATE あり| D[一時テーブル作成]
    C -->|権限なし| E[エラー終了]
    D --> F[サーバー情報収集]
    F --> G[各種チェック実行]
    G --> H[セキュリティチェック]
    G --> I[構成チェック]
    G --> J[パフォーマンスチェック]
    G --> K[バックアップチェック]
    H & I & J & K --> L[結果集約]
    L --> M{出力形式判定}
    M -->|TABLE| N[テーブル出力]
    M -->|MARKDOWN| O[MARKDOWN出力]
    M -->|XML| P[XML出力]
    N & O & P --> Q[クリーンアップ]
    Q --> R[バッチ終了]
```

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

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

| 処理 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 診断情報取得 | sys.databases | SELECT | データベース一覧と設定の取得 |
| 診断情報取得 | sys.configurations | SELECT | サーバー構成の取得 |
| 診断情報取得 | msdb.dbo.backupset | SELECT | バックアップ履歴の取得 |
| 診断情報取得 | msdb.dbo.sysjobs | SELECT | ジョブ情報の取得 |
| 結果出力 | @OutputTableName | INSERT | 診断結果の永続化 |

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

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

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| INSERT | Priority, FindingsGroup, Finding, etc. | 各チェック項目の結果 | 診断結果を一時的に格納 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 権限エラー | VIEW SERVER STATE権限がない | 必要な権限を付与する |
| - | データベースアクセスエラー | オフラインDBがある | 初回失敗後、再実行で解決 |
| - | タイムアウト | 大規模環境での長時間実行 | @BringThePain=0で実行 |

### リトライ仕様

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

### 障害時対応

- オフラインデータベースがある場合、初回実行時に失敗するが2回目で成功する
- 権限不足の場合は、必要な権限（VIEW SERVER STATE）を付与して再実行
- タイムアウトの場合は、@CheckUserDatabaseObjects=0で実行範囲を限定

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | READ UNCOMMITTEDで実行 |
| コミットタイミング | 明示的なトランザクション管理なし |
| ロールバック条件 | 該当なし（読み取り専用） |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 100-500チェック項目 |
| 目標処理時間 | 数秒〜数分（環境規模による） |
| メモリ使用量上限 | 環境依存 |

## 排他制御

- 読み取り専用のため排他制御は不要
- READ UNCOMMITTED分離レベルで実行されるため、ロックの取得を最小化

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| 開始ログ | @Debug=1時 | 各処理ステップの開始メッセージ |
| 進捗ログ | @Debug=1時 | チェック項目の実行状況 |
| 終了ログ | @Debug=1時 | 処理完了メッセージ |
| エラーログ | エラー発生時 | RAISERROR経由のエラーメッセージ |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| 処理時間 | 環境依存 | 該当なし（手動監視） |
| エラー件数 | 0件 | @EmailRecipients指定時にメール通知 |

## 備考

- バージョン: 8.29（2026年2月3日）
- ライセンス: MIT License
- 詳細情報: http://FirstResponderKit.org
- 既知の制限:
  - データベース名に「?」が含まれる場合、一部テストが失敗する
  - オフラインデータベースがある場合、初回実行で失敗する可能性がある
