# 機能設計書 11-Install-All-Scripts

## 概要

本ドキュメントは、SQL Server First Responder Kitの全ストアドプロシージャを一括インストールするスクリプト（Install-All-Scripts.sql）の機能設計を記載したものである。

### 本機能の処理概要

**業務上の目的・背景**：SQL Serverの運用管理・診断・パフォーマンス分析には、sp_Blitz、sp_BlitzCache、sp_BlitzFirst、sp_BlitzIndexなど複数のストアドプロシージャが必要となる。これらを個別にインストールするのは煩雑であり、バージョン管理も困難となる。本スクリプトは、First Responder Kitの全ツールを単一のスクリプト実行で一括インストールし、DBAの作業効率を大幅に向上させる。

**機能の利用シーン**：
- 新規SQL Serverインスタンスへの診断ツール一括導入
- First Responder Kitの新バージョンへのアップグレード
- 複数サーバーへの統一された診断環境の展開
- 災害復旧後のツール再インストール

**主要な処理内容**：
1. 各ストアドプロシージャの存在チェック（OBJECT_ID確認）
2. 存在しない場合は空のプロシージャを作成（CREATE PROCEDURE）
3. ALTER PROCEDUREで完全な実装に置換
4. 一時テーブル・グローバル一時テーブルの初期化
5. バージョン情報の埋め込み

**関連システム・外部連携**：
- SQL Serverシステムカタログビュー（sys.objects, sys.databases等）
- 拡張イベント（sp_BlitzLockなど）
- DMV（動的管理ビュー）への参照（各診断プロシージャ内部）

**権限による制御**：
- masterデータベースへのインストールには、sysadmin権限またはdb_owner権限が必要
- 各プロシージャはVIEW SERVER STATE権限、一部はCONTROL SERVER権限を実行時に要求

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | SSMSクエリエディタ | 実行画面 | スクリプトをSSMSで実行してインストール |

## 機能種別

インストール・デプロイメント

## 入力仕様

### 入力パラメータ

本スクリプトはパラメータを持たない。スクリプト全体を実行することでインストールが完了する。

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| （なし） | - | - | - | - |

### 入力データソース

- Install-All-Scripts.sqlファイル本体（約42,000行、約2MB）
- 実行対象データベース（masterデータベースを推奨）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| インストール結果メッセージ | テキスト | 各プロシージャの作成・更新状況 |

### 出力先

| 出力種別 | 出力先 | 説明 |
|---------|--------|------|
| ストアドプロシージャ | dbo.sp_Blitz | サーバーヘルスチェック |
| ストアドプロシージャ | dbo.sp_BlitzAnalysis | パフォーマンスデータ集約分析 |
| ストアドプロシージャ | dbo.sp_BlitzBackups | バックアップ履歴分析 |
| ストアドプロシージャ | dbo.sp_BlitzCache | プランキャッシュ分析 |
| ストアドプロシージャ | dbo.sp_BlitzFirst | リアルタイム診断 |
| ストアドプロシージャ | dbo.sp_BlitzIndex | インデックス分析 |
| ストアドプロシージャ | dbo.sp_BlitzLock | デッドロック分析 |
| ストアドプロシージャ | dbo.sp_BlitzWho | 現在実行中クエリ監視 |
| ストアドプロシージャ | dbo.sp_DatabaseRestore | データベースリストア支援 |
| ストアドプロシージャ | dbo.sp_ineachdb | 複数DB一括コマンド実行 |
| グローバル一時テーブル | ##BlitzCacheResults | sp_BlitzCache用中間結果 |
| グローバル一時テーブル | ##BlitzCacheProcs | sp_BlitzCache用中間結果 |

## 処理フロー

### 処理シーケンス

```
1. sp_Blitzのインストール
   └─ OBJECT_ID確認 → CREATE/ALTER PROCEDURE
2. sp_BlitzAnalysisのインストール
   └─ OBJECT_ID確認 → CREATE/ALTER PROCEDURE
3. sp_BlitzBackupsのインストール
   └─ OBJECT_ID確認 → CREATE/ALTER PROCEDURE
4. sp_BlitzCacheのインストール
   └─ OBJECT_ID確認 → グローバル一時テーブル作成 → CREATE/ALTER PROCEDURE
5. sp_BlitzFirstのインストール
   └─ OBJECT_ID確認 → CREATE/ALTER PROCEDURE
6. sp_BlitzIndexのインストール
   └─ OBJECT_ID確認 → CREATE/ALTER PROCEDURE
7. sp_BlitzLockのインストール
   └─ OBJECT_ID確認 → CREATE/ALTER PROCEDURE
8. sp_BlitzWhoのインストール
   └─ OBJECT_ID確認 → CREATE/ALTER PROCEDURE
9. sp_DatabaseRestoreのインストール
   └─ OBJECT_ID確認 → CREATE/ALTER PROCEDURE
10. sp_ineachdbのインストール
    └─ OBJECT_ID確認 → CREATE/ALTER PROCEDURE
```

### フローチャート

```mermaid
flowchart TD
    A[スクリプト実行開始] --> B{sp_Blitz存在確認}
    B -->|存在しない| C[空のsp_Blitz作成]
    B -->|存在する| D[ALTER PROCEDUREで更新]
    C --> D
    D --> E{sp_BlitzAnalysis存在確認}
    E -->|存在しない| F[空のsp_BlitzAnalysis作成]
    E -->|存在する| G[ALTER PROCEDUREで更新]
    F --> G
    G --> H[残りのプロシージャを順次処理]
    H --> I{sp_BlitzCache処理}
    I --> J[グローバル一時テーブル作成]
    J --> K[プロシージャ作成/更新]
    K --> L[全プロシージャインストール完了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 冪等性の保証 | スクリプトは何度実行しても同じ結果となる | 常時 |
| BR-02 | 既存更新 | 既存プロシージャがある場合は内容を更新 | プロシージャ存在時 |
| BR-03 | バージョン埋め込み | 各プロシージャにバージョン番号と日付を埋め込む | 常時 |
| BR-04 | masterデータベース推奨 | masterへのインストールにより全DBから実行可能 | 推奨構成 |

### 計算ロジック

特になし。インストール処理のみ。

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| インストール | sys.objects | SELECT | プロシージャ存在確認 |
| インストール | dbo.sp_* | CREATE/ALTER | ストアドプロシージャの作成・更新 |
| インストール | tempdb.##BlitzCacheResults | CREATE | グローバル一時テーブル作成 |
| インストール | tempdb.##BlitzCacheProcs | CREATE | グローバル一時テーブル作成 |

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

#### sys.objects（参照のみ）

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | object_id | OBJECT_ID('dbo.sp_*')による存在確認 | NULL判定で分岐 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 権限エラー | CREATE/ALTER PROCEDURE権限なし | db_owner以上の権限付与 |
| - | 構文エラー | SQL Serverバージョン非互換 | サポートバージョン確認（2008以降） |
| - | タイムアウト | 大規模環境での実行遅延 | タイムアウト設定延長 |

### リトライ仕様

スクリプトは冪等性を持つため、エラー発生時は原因解消後に再実行可能。

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

各GOステートメントでバッチが区切られ、個別にコミットされる。トランザクション制御は行わない。

## パフォーマンス要件

- 実行時間：通常30秒〜2分程度
- ファイルサイズ：約2MB（約42,000行）
- メモリ：SSMSのクエリエディタで読み込み可能な範囲

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

- sysadminまたはdb_owner権限が必要
- masterデータベースへのインストールを推奨（セキュリティポリシーに応じて変更可能）
- ストアドプロシージャは実行時にVIEW SERVER STATE権限を要求

## 備考

- バージョン8.29（2026年2月3日リリース）時点の情報
- SQL Server 2008以降でサポート
- Azure SQL Database環境では代わりにInstall-Azure.sqlを使用

---

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

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

### 推奨読解順序

#### Step 1: ファイル構造を理解する

Install-All-Scripts.sqlは、複数のストアドプロシージャ定義を連結した単一ファイルである。GOステートメントでバッチが区切られている。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Install-All-Scripts.sql | `Install-All-Scripts.sql` | ファイル全体の構造、GOステートメントによるバッチ分離 |

**読解のコツ**:
- 各プロシージャは`IF OBJECT_ID('dbo.sp_*') IS NULL`パターンで始まる
- `EXEC ('CREATE PROCEDURE...')`で空のプロシージャを作成後、`ALTER PROCEDURE`で実装を上書き
- この2段階方式により、CREATE/ALTER両方に対応した冪等性を実現

#### Step 2: 各プロシージャの配置を理解する

| 順序 | プロシージャ | 開始行（目安） | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_Blitz | 1行目 | 最初のプロシージャ、ヘルスチェック機能 |
| 2-2 | sp_BlitzAnalysis | 10,700行目付近 | BlitzFirst出力の分析 |
| 2-3 | sp_BlitzBackups | 11,600行目付近 | バックアップ履歴分析 |
| 2-4 | sp_BlitzCache | 13,100行目付近 | プランキャッシュ分析 |
| 2-5 | sp_BlitzFirst | 21,300行目付近 | リアルタイム診断 |
| 2-6 | sp_BlitzIndex | 21,300行目付近 | インデックス分析 |
| 2-7 | sp_BlitzLock | 後半部分 | デッドロック分析 |
| 2-8 | sp_BlitzWho | 後半部分 | 実行中クエリ監視 |
| 2-9 | sp_DatabaseRestore | 後半部分 | リストア支援 |
| 2-10 | sp_ineachdb | 最終部分 | 複数DB一括実行 |

**主要処理フロー**:
1. **1-3行目**: sp_Blitzの存在チェックと空プロシージャ作成
2. **5-10,700行目付近**: sp_Blitzの完全実装（ALTER PROCEDURE）
3. **10,700行目以降**: 残りのプロシージャが同様のパターンで続く

#### Step 3: プロシージャ作成パターンを理解する

各プロシージャは以下の共通パターンで定義される：

```sql
-- パターン1: 存在チェックと作成
IF OBJECT_ID('dbo.sp_プロシージャ名') IS NULL
  EXEC ('CREATE PROCEDURE dbo.sp_プロシージャ名 AS RETURN 0;');
GO

-- パターン2: 完全実装で上書き
ALTER PROCEDURE [dbo].[sp_プロシージャ名]
    @パラメータ1 型 = デフォルト値,
    @パラメータ2 型 = デフォルト値
AS
BEGIN
    -- 実装本体
END
GO
```

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

```
Install-All-Scripts.sql
    │
    ├─ sp_Blitz
    │      └─ 内部でsp_BlitzCacheを呼び出し可能
    │
    ├─ sp_BlitzAnalysis
    │      └─ BlitzFirst/BlitzCache/BlitzWhoテーブルを参照
    │
    ├─ sp_BlitzBackups
    │
    ├─ sp_BlitzCache
    │      └─ ##BlitzCacheResults, ##BlitzCacheProcsを使用
    │
    ├─ sp_BlitzFirst
    │      └─ 内部でsp_BlitzWhoを呼び出し
    │      └─ 内部でsp_BlitzCacheを呼び出し可能
    │
    ├─ sp_BlitzIndex
    │
    ├─ sp_BlitzLock
    │
    ├─ sp_BlitzWho
    │
    ├─ sp_DatabaseRestore
    │
    └─ sp_ineachdb
           └─ 他のストアドプロシージャを複数DBで実行可能
```

### データフロー図

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

Install-All-Scripts.sql ───▶ SSMS/sqlcmd実行 ───▶ dbo.sp_Blitz
                                   │              dbo.sp_BlitzAnalysis
                                   │              dbo.sp_BlitzBackups
                                   │              dbo.sp_BlitzCache
                                   │              dbo.sp_BlitzFirst
                                   │              dbo.sp_BlitzIndex
                                   │              dbo.sp_BlitzLock
                                   │              dbo.sp_BlitzWho
                                   │              dbo.sp_DatabaseRestore
                                   │              dbo.sp_ineachdb
                                   │
                                   └─────────────▶ ##BlitzCacheResults
                                                   ##BlitzCacheProcs
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Install-All-Scripts.sql | `Install-All-Scripts.sql` | ソース | 全プロシージャの一括インストールスクリプト |
| Install-Azure.sql | `Install-Azure.sql` | ソース | Azure SQL DB用インストールスクリプト |
| Uninstall.sql | `Uninstall.sql` | ソース | アンインストールスクリプト |
| sp_Blitz.sql | `sp_Blitz.sql` | ソース | sp_Blitz単体ファイル |
| sp_BlitzCache.sql | `sp_BlitzCache.sql` | ソース | sp_BlitzCache単体ファイル |
| sp_BlitzFirst.sql | `sp_BlitzFirst.sql` | ソース | sp_BlitzFirst単体ファイル |
| sp_BlitzIndex.sql | `sp_BlitzIndex.sql` | ソース | sp_BlitzIndex単体ファイル |
| sp_BlitzLock.sql | `sp_BlitzLock.sql` | ソース | sp_BlitzLock単体ファイル |
| sp_BlitzWho.sql | `sp_BlitzWho.sql` | ソース | sp_BlitzWho単体ファイル |
| sp_BlitzAnalysis.sql | `sp_BlitzAnalysis.sql` | ソース | sp_BlitzAnalysis単体ファイル |
| sp_BlitzBackups.sql | `sp_BlitzBackups.sql` | ソース | sp_BlitzBackups単体ファイル |
| sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | ソース | sp_DatabaseRestore単体ファイル |
| sp_ineachdb.sql | `sp_ineachdb.sql` | ソース | sp_ineachdb単体ファイル |
