# 機能設計書 13-Uninstall

## 概要

本ドキュメントは、First Responder Kitの全ストアドプロシージャとテーブルを削除するアンインストールスクリプト（Uninstall.sql）の機能設計を記載したものである。

### 本機能の処理概要

**業務上の目的・背景**：SQL Server環境からFirst Responder Kitを完全にアンインストールする必要が生じる場面がある。例えば、別バージョンへのクリーンインストール、テスト環境のクリーンアップ、セキュリティポリシーに基づく不要ツールの削除などである。本スクリプトは、インストールされた全てのFirst Responder Kitオブジェクトを安全かつ確実に削除する。

**機能の利用シーン**：
- First Responder Kitの完全アンインストール
- テスト環境・開発環境のクリーンアップ
- 本番環境からの診断ツール撤去
- クリーンな状態での再インストール準備
- 複数データベースからの一括削除

**主要な処理内容**：
1. 削除対象プロシージャ一覧を一時テーブルに格納
2. 現在のデータベース内の対象プロシージャを検索
3. 存在するプロシージャのDROP文を動的生成
4. SqlServerVersionsテーブルの削除
5. 生成されたSQL文の実行（または表示のみ）
6. オプションで全データベースを対象に処理

**関連システム・外部連携**：
- SQL Serverシステムカタログビュー（sys.procedures, sys.tables, sys.databases）
- 各データベースのdboスキーマ

**権限による制御**：
- 対象データベースへのdb_owner権限が必要
- 全データベース削除時はsysadmin権限を推奨

## 関連画面

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

## 機能種別

アンインストール・クリーンアップ

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| @allDatabases | bit | No（デフォルト:0） | 1=全データベースから削除、0=現在のデータベースのみ | 0または1 |
| @printOnly | bit | No（デフォルト:0） | 1=DROP文を表示のみ、0=実際に削除実行 | 0または1 |

### 入力データソース

- Uninstall.sqlファイル本体（89行）
- 実行対象データベース（複数可）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| 削除SQL文 | テキスト | 生成されたDROP PROCEDURE/DROP TABLE文（PRINT出力） |

### 出力先

| 出力種別 | 出力先 | 説明 |
|---------|--------|------|
| メッセージ | SSMSメッセージタブ | 生成された削除SQL文 |

### 削除対象オブジェクト

| オブジェクト種別 | オブジェクト名 | 説明 |
|-----------------|---------------|------|
| ストアドプロシージャ | sp_AllNightLog | （非推奨）ログシッピング自動化 |
| ストアドプロシージャ | sp_AllNightLog_Setup | （非推奨）ログシッピング設定 |
| ストアドプロシージャ | sp_Blitz | サーバーヘルスチェック |
| ストアドプロシージャ | sp_BlitzAnalysis | パフォーマンスデータ分析 |
| ストアドプロシージャ | sp_BlitzBackups | バックアップ履歴分析 |
| ストアドプロシージャ | sp_BlitzCache | プランキャッシュ分析 |
| ストアドプロシージャ | sp_BlitzFirst | リアルタイム診断 |
| ストアドプロシージャ | sp_BlitzInMemoryOLTP | （非推奨）インメモリOLTP分析 |
| ストアドプロシージャ | sp_BlitzIndex | インデックス分析 |
| ストアドプロシージャ | sp_BlitzLock | デッドロック分析 |
| ストアドプロシージャ | sp_BlitzQueryStore | （非推奨）Query Store分析 |
| ストアドプロシージャ | sp_BlitzWho | 実行中クエリ監視 |
| ストアドプロシージャ | sp_DatabaseRestore | リストア支援 |
| ストアドプロシージャ | sp_foreachdb | （旧名）複数DB一括実行 |
| ストアドプロシージャ | sp_ineachdb | 複数DB一括実行 |
| テーブル | dbo.SqlServerVersions | SQL Serverバージョン情報 |

## 処理フロー

### 処理シーケンス

```
1. 設定パラメータの確認
   └─ @allDatabases: 全DB対象か現在DBのみか
   └─ @printOnly: 実行するか表示のみか

2. 削除対象リストの作成
   └─ #ToDeleteに対象プロシージャ名を格納

3. 削除SQL文の生成
   ├─ @allDatabases = 0の場合
   │     └─ 現在DBのsys.proceduresと結合
   │     └─ SqlServerVersionsテーブルも確認
   └─ @allDatabases = 1の場合
         └─ sys.databasesをカーソルでループ
         └─ 各DBでsys.proceduresと結合
         └─ 各DBでSqlServerVersionsを確認

4. SQL文の出力
   └─ PRINT @SQL（常に実行）

5. SQL文の実行
   └─ @printOnly = 0の場合のみsp_executesqlで実行
```

### フローチャート

```mermaid
flowchart TD
    A[スクリプト開始] --> B[#ToDeleteに対象プロシージャ一覧を格納]
    B --> C{@allDatabases = 1?}
    C -->|No| D[現在DBのみ処理]
    C -->|Yes| E[全DBをカーソルでループ]
    D --> F[sys.proceduresと結合してDROP文生成]
    E --> G[各DBでsys.proceduresと結合]
    G --> F
    F --> H[SqlServerVersionsテーブルのDROP文生成]
    H --> I[PRINT @SQL]
    I --> J{@printOnly = 0?}
    J -->|No| K[処理終了]
    J -->|Yes| L[sp_executesql @SQL実行]
    L --> K
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 安全性確保 | デフォルトでは現在のデータベースのみ対象 | @allDatabases未指定時 |
| BR-02 | ドライラン対応 | @printOnly=1で実際の削除を行わず確認可能 | @printOnly=1 |
| BR-03 | 存在確認 | 存在しないオブジェクトは削除対象に含まれない | 常時 |
| BR-04 | オフラインDB除外 | state=0（ONLINE）のデータベースのみ対象 | @allDatabases=1 |

### 計算ロジック

特になし。削除処理のみ。

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 参照 | sys.procedures | SELECT | 対象プロシージャの存在確認 |
| 参照 | sys.tables | SELECT | SqlServerVersionsテーブルの存在確認 |
| 参照 | sys.databases | SELECT | 全データベース一覧取得（@allDatabases=1時） |
| 削除 | dbo.sp_* | DROP PROCEDURE | ストアドプロシージャの削除 |
| 削除 | dbo.SqlServerVersions | DROP TABLE | バージョンテーブルの削除 |

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

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

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | name | #ToDeleteとJOINして対象抽出 | COLLATE DATABASE_DEFAULTで照合順序対応 |

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

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | name | name = 'SqlServerVersions' | schema_id = 1（dbo） |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 権限エラー | DROP権限なし | db_owner以上の権限付与 |
| - | ロックエラー | プロシージャ実行中に削除試行 | 実行完了後に再試行 |
| - | オフラインDB | @allDatabases=1でオフラインDB存在 | 自動的にスキップ |

### リトライ仕様

スクリプトは再実行可能。既に削除されたオブジェクトは対象から除外される。

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

単一のsp_executesql呼び出しで実行。個別のDROP文はそれぞれコミットされる。

## パフォーマンス要件

- 実行時間：通常1秒〜5秒程度
- ファイルサイズ：89行（約3KB）
- 全データベース対象時：データベース数に比例して時間増加

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

- 対象データベースへのdb_owner権限が必要
- 全データベース削除時はsysadmin権限を推奨
- @printOnly=1でドライラン実行を推奨（本番環境）

## 備考

- 非推奨プロシージャ（sp_AllNightLog、sp_BlitzInMemoryOLTP等）も削除対象に含む
- sp_BlitzFirstが出力するログテーブル（BlitzFirst等）は削除対象外
- 削除前に@printOnly=1で確認することを推奨

---

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

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

### 推奨読解順序

#### Step 1: 設定パラメータを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Uninstall.sql | `Uninstall.sql` | 5-7行目：設定パラメータの宣言 |

**読解のコツ**:
- `@allDatabases`と`@printOnly`の2つのbitパラメータがスクリプトの動作を制御
- 変数宣言部分を修正することで動作を変更

**主要処理フロー**:
- **5行目**: `@allDatabases bit = 0` - デフォルトは現在DBのみ
- **6行目**: `@printOnly bit = 0` - デフォルトは実行モード

#### Step 2: 削除対象リストを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Uninstall.sql | `Uninstall.sql` | 14-31行目：#ToDelete一時テーブルと対象一覧 |

**主要処理フロー**:
- **14-16行目**: 既存#ToDeleteの削除と作成
- **17-31行目**: SELECT UNION形式で対象プロシージャを列挙
  - sp_AllNightLog, sp_AllNightLog_Setup（非推奨）
  - sp_Blitz, sp_BlitzAnalysis, sp_BlitzBackups, sp_BlitzCache
  - sp_BlitzFirst, sp_BlitzInMemoryOLTP（非推奨）
  - sp_BlitzIndex, sp_BlitzLock, sp_BlitzQueryStore（非推奨）
  - sp_BlitzWho, sp_DatabaseRestore
  - sp_foreachdb, sp_ineachdb

#### Step 3: 現在DB処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Uninstall.sql | `Uninstall.sql` | 35-46行目：@allDatabases=0の場合の処理 |

**主要処理フロー**:
- **38-40行目**: sys.proceduresとJOINしてDROP PROCEDURE文を生成
- **42-44行目**: SqlServerVersionsテーブルのDROP TABLE文を生成

#### Step 4: 全DB処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Uninstall.sql | `Uninstall.sql` | 47-83行目：@allDatabases=1の場合の処理 |

**主要処理フロー**:
- **53-56行目**: sys.databasesからONLINEのDBをカーソルで取得
- **62-67行目**: 各DBでsys.proceduresとJOINして動的SQL生成
- **71-75行目**: 各DBでSqlServerVersionsのDROP TABLE文を生成
- **79-82行目**: カーソルのクローズとデアロケート

#### Step 5: 実行制御を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 5-1 | Uninstall.sql | `Uninstall.sql` | 86-89行目：実行制御 |

**主要処理フロー**:
- **86行目**: `PRINT @SQL` - 常にSQL文を出力
- **88-89行目**: `@printOnly = 0`の場合のみ`sp_executesql @SQL`を実行

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

```
Uninstall.sql
    │
    ├─ パラメータ設定（@allDatabases, @printOnly）
    │
    ├─ #ToDelete一時テーブル作成
    │      └─ 15個のプロシージャ名を格納
    │
    ├─ @allDatabases分岐
    │      ├─ 0: 現在DB処理
    │      │      ├─ sys.procedures参照
    │      │      └─ sys.tables参照
    │      │
    │      └─ 1: 全DB処理
    │             ├─ sys.databases参照
    │             └─ カーソルループ
    │                    ├─ 各DB.sys.procedures参照
    │                    └─ 各DB.sys.tables参照
    │
    └─ 実行制御
           ├─ PRINT @SQL（常時）
           └─ sp_executesql（@printOnly=0時）
```

### データフロー図

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

@allDatabases ──────────▶ 対象DB決定 ──────────────▶ DROP PROCEDURE文
@printOnly ─────────────▶ 実行モード決定            DROP TABLE文
                                │
sys.procedures ─────────▶ 存在確認・JOIN ──────────▶ @SQL変数
sys.tables ─────────────▶ 存在確認                       │
sys.databases ──────────▶ DB一覧取得                     │
                                │                        │
                                └───▶ PRINT / EXEC ─────▶ 削除実行
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Uninstall.sql | `Uninstall.sql` | ソース | アンインストールスクリプト |
| Install-All-Scripts.sql | `Install-All-Scripts.sql` | ソース | インストールスクリプト（対になる） |
| Install-Azure.sql | `Install-Azure.sql` | ソース | Azureインストールスクリプト（対になる） |
