# 通知設計書 113-SkipChecks挿入

## 概要

本ドキュメントは、sp_Blitzストアドプロシージャにおいて、SkipChecksテーブルからチェックスキップ情報を一時テーブルに挿入する処理の開始を通知するデバッグメッセージの設計を定義します。

### 本通知の処理概要

sp_Blitz実行時に、ユーザーが指定したSkipChecksテーブルから、スキップすべきチェック項目のリストを#SkipChecks一時テーブルに読み込む処理の開始をデバッグメッセージとして通知します。

**業務上の目的・背景**：sp_Blitzは多数のヘルスチェック項目を持ちますが、環境によっては特定のチェックをスキップしたいケースがあります（例：既知の問題、ベンダー製品の特性等）。SkipChecksテーブルを使用することで、永続的にスキップするチェックを管理できます。この通知は、デバッグモードにおいてSkipChecks設定の読み込みが開始されたことをDBAに伝え、チェックがスキップされる原因の追跡を支援します。

**通知の送信タイミング**：sp_Blitz実行の初期化フェーズで、@SkipChecksTable、@SkipChecksSchema、@SkipChecksDatabase の3つのパラメータがすべて指定されている場合に送信されます。

**通知の受信者**：sp_Blitzを@Debug = 1または@Debug = 2で実行しているデータベース管理者がSSMS（SQL Server Management Studio）のメッセージタブで受信します。

**通知内容の概要**：「Inserting SkipChecks」というメッセージで、SkipChecksデータの読み込みが開始されたことを伝えます。

**期待されるアクション**：デバッグ目的の通知であり、通常は特別なアクションは不要です。特定のチェックが予期せずスキップされている場合、この通知とSkipChecksテーブルの内容を確認することで原因を特定できます。

## 通知種別

コンソール出力（RAISERROR WITH NOWAIT）- デバッグモード専用

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（RAISERROR WITH NOWAIT） |
| 優先度 | 低（デバッグ情報） |
| リトライ | なし |

### 送信先決定ロジック

sp_Blitzを@Debug IN (1, 2)で実行しているクライアントセッションに対して、RAISERRORによるメッセージ出力として送信されます。@Debug = 0の場合、このメッセージは出力されません。

## 通知テンプレート

### コンソール出力の場合

| 項目 | 内容 |
|-----|------|
| メッセージ形式 | RAISERROR |
| 重大度 | 0（情報メッセージ） |
| 状態 | 1 |

### 本文テンプレート

```
Inserting SkipChecks
```

### 添付ファイル

なし

## テンプレート変数

なし（固定メッセージ）

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| ストアドプロシージャ実行 | SkipChecks読み込み開始 | @Debug IN (1, 2) AND @SkipChecksTable IS NOT NULL AND @SkipChecksSchema IS NOT NULL AND @SkipChecksDatabase IS NOT NULL | デバッグモードかつSkipChecks設定あり |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| @Debug = 0 | デバッグモードが無効の場合 |
| @SkipChecksTable IS NULL | スキップチェックテーブル未指定 |
| @SkipChecksSchema IS NULL | スキップチェックスキーマ未指定 |
| @SkipChecksDatabase IS NULL | スキップチェックデータベース未指定 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[sp_Blitz実行] --> B{SkipChecks設定あり?}
    B -->|No| C[SkipChecks処理スキップ]
    B -->|Yes| D{@Debug IN 1,2?}
    D -->|No| E[SkipChecks挿入処理へ]
    D -->|Yes| F[RAISERROR Inserting SkipChecks]
    F --> E
    E --> G[動的SQL構築]
    G --> H{@SkipChecksServer指定?}
    H -->|Yes| I[リンクサーバー名追加]
    H -->|No| J[ローカル参照]
    I --> K[EXEC動的SQL]
    J --> K
    K --> L[#SkipChecksにデータ挿入]
```

## データベース参照・更新仕様

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| ユーザー指定SkipChecksテーブル | スキップ対象チェックの取得 | @SkipChecksDatabase.@SkipChecksSchema.@SkipChecksTable |

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

#### SkipChecksテーブル（ユーザー指定）

| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| DatabaseName | スキップ対象DB | ServerNameフィルタ適用 |
| CheckID | スキップ対象チェックID | - |
| ServerName | サーバー名フィルタ | NULLまたは現在のサーバー名 |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| #SkipChecks | INSERT | スキップ対象チェックの一時保存 |

#### #SkipChecks

| 操作 | 項目（カラム名） | 更新値 | 備考 |
|-----|-----------------|-------|------|
| INSERT | DatabaseName | ソーステーブルから | スキップ対象のデータベース名 |
| INSERT | CheckID | ソーステーブルから | スキップするチェックのID |
| INSERT | ServerName | ソーステーブルから | 対象サーバー名 |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| テーブル不存在 | 指定されたSkipChecksテーブルが存在しない | 動的SQLエラーとして表示 |
| アクセス権限不足 | テーブルへのSELECT権限がない | 動的SQLエラーとして表示 |

### リトライ仕様

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

## 配信設定

### レート制限

なし

### 配信時間帯

制限なし

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

- デバッグ情報であるため、実運用環境での使用には注意が必要です
- SkipChecksテーブルの内容は表示されませんが、テーブルの存在が示唆されます
- リンクサーバー経由でのアクセスもサポートされており、適切な権限設定が必要です

## 備考

- @SkipChecksServerパラメータが指定されている場合、リンクサーバー経由でデータを取得します
- 挿入されるデータには、現在のサーバー名に一致するか、ServerNameがNULLのレコードのみが含まれます
- この処理後、#SkipChecksテーブルの内容に基づいて各チェック項目のスキップが決定されます

---

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

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

### 推奨読解順序

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

SkipChecksの構造と一時テーブルの定義を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_Blitz.sql | `sp_Blitz.sql` | #SkipChecks一時テーブルの定義 |

**読解のコツ**: CREATE TABLE #SkipChecks文を検索し、テーブル構造を確認します。

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

SkipChecks挿入処理の条件と開始部分を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_Blitz.sql | `sp_Blitz.sql` | パラメータチェックと条件分岐 |

**主要処理フロー**:
1. **行699-702**: @SkipChecksTable, @SkipChecksSchema, @SkipChecksDatabase のNULLチェック
2. **行704**: RAISERROR('Inserting SkipChecks', 0, 1)
3. **行706-715**: 動的SQLの構築と実行

#### Step 3: 動的SQL構築を理解する

SkipChecksデータを取得するためのSQLがどのように構築されるかを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sp_Blitz.sql | `sp_Blitz.sql` | @StringToExecute変数への文字列構築 |

**主要処理フロー**:
- **行706-707**: 基本SELECT文の構築
- **行709-712**: @SkipChecksServer指定時のリンクサーバー参照追加
- **行713-714**: WHERE句とOPTION句の追加
- **行715**: EXEC()による動的SQL実行

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

```
sp_Blitz
    |
    +-- (条件) @SkipChecksTable/Schema/Database NOT NULL
            |
            +-- RAISERROR('Inserting SkipChecks')
            |
            +-- @StringToExecute構築
            |       |
            |       +-- (条件) @SkipChecksServer NOT NULL
            |               |
            |               +-- リンクサーバー名を追加
            |
            +-- EXEC(@StringToExecute)
                    |
                    +-- #SkipChecks に INSERT
```

### データフロー図

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

@SkipChecksServer         -->
@SkipChecksDatabase       --> 動的SQL構築
@SkipChecksSchema         -->                         --> @StringToExecute
@SkipChecksTable          -->

SkipChecksテーブル        --> EXEC(@StringToExecute) --> #SkipChecks
(DatabaseName,
 CheckID,
 ServerName)

SERVERPROPERTY('ServerName') --> WHERE句フィルタ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| sp_Blitz.sql | `sp_Blitz.sql` | ソース | 本通知を発行するストアドプロシージャ |
| Install-All-Scripts.sql | `Install-All-Scripts.sql` | ソース | sp_Blitzを含むインストールスクリプト |
