# 通知設計書 13-出力データベース無効

## 概要

本ドキュメントは、sp_BlitzLock ストアドプロシージャにおいて、出力テーブル用のデータベース名が無効な場合に発生するエラー通知の設計書である。

### 本通知の処理概要

本通知は、デッドロック分析結果を外部テーブルに保存する際に、指定された出力先データベースの存在を検証し、無効な場合に警告を通知する機能を提供する。

**業務上の目的・背景**：sp_BlitzLockは、デッドロック分析結果を永続化するために外部テーブルへの出力機能を提供している。出力先データベースが存在しない場合、データの永続化に失敗するため、事前に検証して警告を通知する。本エラーは処理を中断せず、警告メッセージを出力してテーブル出力をスキップする。

**通知の送信タイミング**：sp_BlitzLock実行時の初期検証フェーズで、@OutputDatabaseNameパラメータが指定され、かつsys.databasesに該当するデータベースが存在しない場合に警告が発生する。

**通知の受信者**：sp_BlitzLockを実行したSQL Serverセッションの呼び出し元。通常はDBA（データベース管理者）やSQL Serverエージェントジョブ。

**通知内容の概要**：指定されたデータベース名と、データベースが無効である旨の警告メッセージを含む。テーブル出力がスキップされることも通知する。

**期待されるアクション**：受信者は、正しいデータベース名を@OutputDatabaseNameパラメータに指定してsp_BlitzLockを再実行するか、出力先データベースを作成する。

## 通知種別

SQLメッセージ（RAISERROR）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期 |
| 優先度 | 低（Severity 0） |
| リトライ | なし |

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

実行中のSQL Serverセッションに対して直接メッセージを送信する。特定の宛先決定ロジックは不要。

## 通知テンプレート

### SQLメッセージの場合

| 項目 | 内容 |
|-----|------|
| Severity | 0 |
| State | 1 |
| WITH NOWAIT | あり |

### 本文テンプレート

```
Database Name (%s) for output of table is invalid please, Output to Table will not be performed
```

### 添付ファイル

| ファイル名 | 形式 | 条件 | 説明 |
|----------|------|------|------|
| なし | - | - | - |

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| @OutputDatabaseName | 出力データベース名 | @OutputDatabaseNameパラメータ | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| プロシージャ実行 | sp_BlitzLock実行 | @OutputDatabaseNameが指定され、sys.databasesに存在しない | パラメータ検証フェーズで発生 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| @OutputDatabaseNameがNULL | 出力データベースが指定されていない場合は検証しない |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[sp_BlitzLock実行] --> B{@OutputDatabaseName IS NOT NULL?}
    B -->|No| C[検証スキップ - 処理継続]
    B -->|Yes| D[sys.databasesで存在確認]
    D --> E{データベース存在?}
    E -->|Yes| F[@OutputDatabaseCheck = 0 - 処理継続]
    E -->|No| G[RAISERROR警告発行]
    G --> H[@OutputDatabaseCheck = -1]
    H --> I[テーブル出力スキップで処理継続]
```

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

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| sys.databases | データベース存在確認 | d.name = @OutputDatabaseName |

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

#### sys.databases

| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| d.name | データベース名 | WHERE d.name = @OutputDatabaseName |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| なし | - | 本通知処理でデータ更新は行わない |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 出力データベース無効 | 指定されたデータベースが存在しない | 正しいデータベース名を指定するか、データベースを作成 |

### リトライ仕様

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

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | なし |
| 1日あたり上限 | なし |

### 配信時間帯

制限なし

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

- sys.databasesの参照には特別な権限は不要
- データベース名はユーザー入力値だが、パラメータとしてバインドされるためSQLインジェクションのリスクは低い

## 備考

- このエラーは警告（Severity 0）であり、プロシージャは終了せず処理を継続する
- @OutputDatabaseCheckフラグが-1に設定され、後続のテーブル出力処理がスキップされる
- デッドロック分析自体は実行され、結果セットは返却される

---

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

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

### 推奨読解順序

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

sp_BlitzLockのパラメータ定義と、出力関連のパラメータを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_BlitzLock.sql | `sp_BlitzLock.sql` | プロシージャのパラメータ定義（@OutputDatabaseName等） |

**読解のコツ**: CREATE PROCEDURE文のパラメータ宣言部分を確認し、@OutputDatabaseName、@OutputSchemaName、@OutputTableNameの関連を理解する。

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

データベース検証ロジックの開始点を特定する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_BlitzLock.sql | `sp_BlitzLock.sql` | 行572-590付近の出力データベース検証部分 |

**主要処理フロー**:
1. **行572-575**: @OutputDatabaseNameが設定されている場合の処理開始
2. **行577-583**: sys.databasesでの存在確認
3. **行585**: RAISERRORによる警告メッセージ発行
4. **行586**: @OutputDatabaseCheck = -1の設定

#### Step 3: フラグの使用箇所を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sp_BlitzLock.sql | `sp_BlitzLock.sql` | @OutputDatabaseCheckフラグの参照箇所 |

**主要処理フロー**:
- @OutputDatabaseCheck = 0: 正常（テーブル出力を実行）
- @OutputDatabaseCheck = -1: 無効（テーブル出力をスキップ）

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

```
sp_BlitzLock
    |
    +-- 出力設定検証フェーズ
    |      |
    |      +-- @OutputDatabaseName IS NOT NULL の確認
    |             |
    |             +-- sys.databases で存在確認
    |             |
    |             +-- 存在しない場合
    |                    |
    |                    +-- RAISERROR (Severity 0)
    |                    |
    |                    +-- @OutputDatabaseCheck = -1
    |
    +-- デッドロック分析フェーズ（継続）
    |
    +-- テーブル出力フェーズ
           |
           +-- @OutputDatabaseCheck の確認
           |
           +-- -1 の場合: スキップ
           +-- 0 の場合: 出力実行
```

### データフロー図

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

@OutputDatabaseName ────> sys.databases参照 ────> 検証結果 ────> 警告メッセージ
                          |                        |              |
                          v                        v              v
                     SELECT 1/0                 存在確認       RAISERROR
                     WHERE d.name =             結果           (Severity 0)
                     @OutputDatabaseName
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| sp_BlitzLock.sql | `sp_BlitzLock.sql` | ソース | デッドロック分析プロシージャ本体 |
| Install-All-Scripts.sql | `Install-All-Scripts.sql` | インストールスクリプト | 全スクリプトの一括インストール（sp_BlitzLock含む） |
| Install-Azure.sql | `Install-Azure.sql` | インストールスクリプト | Azure用インストールスクリプト |
