# 通知設計書 118-DBCC inputbuffer失敗

## 概要

本ドキュメントは、sp_BlitzWhoストアドプロシージャにおいて、特定のセッションに対するDBCC INPUTBUFFERコマンドが失敗した場合に出力されるデバッグメッセージの設計を定義します。

### 本通知の処理概要

sp_BlitzWho実行時に、各ユーザーセッションの入力バッファ情報を取得するためのDBCC INPUTBUFFERコマンドが失敗した場合に、該当セッションIDを含むデバッグメッセージを出力します。

**業務上の目的・背景**：sp_BlitzWhoは、現在実行中のクエリとそのコンテキスト情報を収集する診断ツールです。@GetOuterCommand = 1が設定されている場合、各セッションの「外部コマンド」（ストアドプロシージャ呼び出し元のSQL文等）を取得するためにDBCC INPUTBUFFERを使用します。しかし、一部のシステムセッションや特殊な状態のセッションではDBCC INPUTBUFFERが失敗することがあります。この通知は、そのような失敗を記録し、DBAが結果セットに欠落がある理由を理解する助けとなります。

**通知の送信タイミング**：sp_BlitzWho実行時、@GetOuterCommand = 1かつsys.dm_exec_input_buffer DMFが存在しない環境で、各ユーザーセッションに対してDBCC INPUTBUFFERを実行する際、TRY-CATCHブロックのCATCH部分で送信されます。

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

**通知内容の概要**：「DBCC inputbuffer failed for session %d」の形式で、失敗したセッションIDを含むメッセージが出力されます。

**期待されるアクション**：通常は特別なアクションは不要です。特定のセッションの外部コマンド情報が取得できないことを示しますが、システムセッションや終了直前のセッションでは正常な動作です。頻繁に発生する場合は、対象セッションの状態を確認してください。

## 通知種別

コンソール出力（RAISERROR WITH NOWAIT）- デバッグ情報

## 送信仕様

### 基本情報

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

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

sp_BlitzWhoを実行しているクライアントセッションに対して、RAISERRORによるメッセージ出力として送信されます。

## 通知テンプレート

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

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

### 本文テンプレート

```
DBCC inputbuffer failed for session %d
```

### 添付ファイル

なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| %d | 失敗したセッションID | @session_id変数（カーソルから取得） | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| ストアドプロシージャ実行 | DBCC INPUTBUFFER失敗 | @GetOuterCommand = 1 AND dm_exec_input_buffer不存在 AND DBCC INPUTBUFFER例外発生 | 旧バージョンSQL Serverでの外部コマンド取得失敗 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| @GetOuterCommand = 0 | 外部コマンド取得が無効 |
| dm_exec_input_bufferが存在 | SQL Server 2014 SP2以降では新しいDMFを使用 |
| DBCC INPUTBUFFERが成功 | 正常に実行された場合 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[sp_BlitzWho実行] --> B{@GetOuterCommand = 1?}
    B -->|No| C[外部コマンド取得スキップ]
    B -->|Yes| D{dm_exec_input_buffer存在?}
    D -->|Yes| E[dm_exec_input_buffer使用]
    D -->|No| F[カーソル作成 全ユーザーセッション]
    F --> G[FETCH NEXT session_id]
    G --> H{END OF CURSOR?}
    H -->|Yes| I[カーソルクローズ]
    H -->|No| J[BEGIN TRY]
    J --> K[DBCC INPUTBUFFER実行]
    K --> L[@inputbufferに結果挿入]
    L --> G
    J --> M[BEGIN CATCH]
    M --> N[RAISERROR DBCC inputbuffer failed...]
    N --> G
```

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

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| sys.dm_exec_sessions | ユーザーセッション一覧取得 | カーソルソース |

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

#### sys.dm_exec_sessions

| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| session_id | セッション識別 | session_id <> @@SPID AND is_user_process = 1 |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| @inputbuffer | INSERT | DBCC INPUTBUFFER結果の格納 |

#### @inputbuffer（テーブル変数）

| 操作 | 項目（カラム名） | 更新値 | 備考 |
|-----|-----------------|-------|------|
| INSERT | session_id | 対象セッションID | SCOPE_IDENTITY()後に更新 |
| INSERT | event_type | DBCC INPUTBUFFER出力 | - |
| INSERT | parameters | DBCC INPUTBUFFER出力 | - |
| INSERT | event_info | DBCC INPUTBUFFER出力 | SQL文 |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| DBCC INPUTBUFFER失敗 | 対象セッションがアクセス不可 | メッセージ出力して次のセッションへ |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0（次のセッションへ進む） |
| リトライ間隔 | - |
| リトライ対象エラー | - |

## 配信設定

### レート制限

なし（各失敗セッションごとに出力）

### 配信時間帯

制限なし

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

- セッションIDのみが表示され、機密情報は含まれません
- DBCC INPUTBUFFERの失敗理由は表示されません

## 備考

- SQL Server 2014 SP2以降では、sys.dm_exec_input_buffer DMFが使用可能であり、この処理パスは通常通過しません
- カーソルを使用した処理であるため、大量のセッションがある環境ではパフォーマンスに影響する可能性があります
- システムセッション（is_user_process = 0）は処理対象外です

---

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

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

### 推奨読解順序

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

入力バッファ情報を格納するテーブル変数の構造を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | @inputbufferテーブル変数の宣言 |

**読解のコツ**: DECLARE @inputbuffer TABLEを検索し、ID, session_id, event_type, parameters, event_infoカラムの定義を確認します。

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

DBCC INPUTBUFFER処理の条件分岐を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | @GetOuterCommandチェックとdm_exec_input_buffer存在チェック |

**主要処理フロー**:
1. **行616**: @GetOuterCommand = 1チェック
2. **行616**: NOT EXISTS dm_exec_input_bufferチェック
3. **行632-643**: カーソル定義とオープン
4. **行645-666**: WHILE FETCHループとTRY-CATCH

#### Step 3: TRY-CATCH処理を理解する

DBCC INPUTBUFFER実行とエラーハンドリングを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sp_BlitzWho.sql | `sp_BlitzWho.sql` | BEGIN TRY - BEGIN CATCH構造 |

**主要処理フロー**:
- **行647-658**: BEGIN TRY内でDBCC INPUTBUFFER実行と結果挿入
- **行659-662**: BEGIN CATCH内でRAISERROR

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

```
sp_BlitzWho
    |
    +-- (条件) @GetOuterCommand = 1 AND NOT EXISTS dm_exec_input_buffer
            |
            +-- DECLARE inputbuffer_cursor
            |
            +-- OPEN inputbuffer_cursor
            |
            +-- WHILE @@FETCH_STATUS = 0
                    |
                    +-- FETCH NEXT INTO @session_id
                    |
                    +-- BEGIN TRY
                    |       |
                    |       +-- DBCC INPUTBUFFER(@session_id)
                    |       |
                    |       +-- INSERT @inputbuffer
                    |       |
                    |       +-- UPDATE @inputbuffer SET session_id
                    |
                    +-- BEGIN CATCH
                            |
                            +-- RAISERROR('DBCC inputbuffer failed for session %d')
            |
            +-- CLOSE / DEALLOCATE inputbuffer_cursor
```

### データフロー図

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

sys.dm_exec_sessions      --> カーソル作成
(is_user_process = 1)         |
                              v
@session_id               --> DBCC INPUTBUFFER
                              |
                              +---> (成功) --> @inputbuffer
                              |                 (event_type, parameters, event_info)
                              |
                              +---> (失敗) --> RAISERROR
                                               'DBCC inputbuffer failed for session %d'
```

### 関連ファイル一覧

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