# 通知設計書 114-DBCC DBINFO抽出

## 概要

本ドキュメントは、sp_Blitzストアドプロシージャにおいて、DBCC DBINFOコマンドを使用してデータベース情報を抽出する処理の開始を通知するデバッグメッセージの設計を定義します。

### 本通知の処理概要

sp_Blitz実行時に、各データベースに対してDBCC DBINFOコマンドを実行し、データベースの内部情報（最終バックアップ日時、最終良好チェック日時等）を抽出する処理の開始をデバッグメッセージとして通知します。

**業務上の目的・背景**：DBCC DBINFOは、SQL Serverの内部データベース情報を取得する非公開コマンドです。sp_Blitzでは、このコマンドから得られるdbi_LastLogBackupTime（最終ログバックアップ時刻）やdbi_LastKnownGood（最終正常DBCC CHECKDB実行日時）を使用して、チェック項目2（ログバックアップ確認）と68（DBCC CHECKDB確認）を実行します。この通知は、デバッグモードにおいてDBCC DBINFO抽出処理が開始されたことをDBAに伝え、処理の進捗追跡やトラブルシューティングを支援します。

**通知の送信タイミング**：sp_Blitz実行の初期化フェーズで、AWS RDS環境でなく、かつチェック2および68の両方がスキップ対象でない場合に送信されます。

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

**通知内容の概要**：「Extracting DBCC DBINFO data (used in checks 2 and 68).」というメッセージで、DBCC DBINFOデータの抽出が開始されたことと、その用途を伝えます。

**期待されるアクション**：デバッグ目的の通知であり、通常は特別なアクションは不要です。この通知後に処理が遅延する場合、データベース数が多いことが原因の可能性があります。

## 通知種別

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

## 送信仕様

### 基本情報

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

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

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

## 通知テンプレート

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

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

### 本文テンプレート

```
Extracting DBCC DBINFO data (used in checks 2 and 68).
```

### 添付ファイル

なし

## テンプレート変数

なし（固定メッセージ）

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| ストアドプロシージャ実行 | DBCC DBINFO抽出開始 | @Debug IN (1, 2) AND NOT AWS RDS AND (Check 2 OR Check 68が有効) | デバッグモード、非AWS RDS、関連チェックが有効 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| @Debug = 0 | デバッグモードが無効の場合 |
| AWS RDS環境 | CheckID 223のレコードが存在する場合 |
| チェック2,68両方スキップ | #SkipChecksにCheckID 2と68の両方が含まれる場合 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[sp_Blitz実行] --> B{AWS RDS環境?}
    B -->|Yes| C[DBCC DBINFO処理スキップ]
    B -->|No| D{Check 2,68両方スキップ?}
    D -->|Yes| C
    D -->|No| E{@Debug IN 1,2?}
    E -->|No| F[DBCC DBINFO抽出処理へ]
    E -->|Yes| G[RAISERROR Extracting DBCC DBINFO...]
    G --> F
    F --> H[sp_MSforeachdb実行]
    H --> I[各DBでDBCC DBINFO実行]
    I --> J[#DBCCsに結果挿入]
    J --> K[DbName更新]
```

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

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| #BlitzResults | AWS RDSチェック | CheckID = 223の確認 |
| #SkipChecks | スキップチェック確認 | CheckID IN (2, 68)の確認 |

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

#### #BlitzResults

| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| CheckID | AWS RDS判定 | CheckID = 223 AND URL = 'https://aws.amazon.com/rds/sqlserver/' |

#### #SkipChecks

| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| CheckID | スキップ判定 | DatabaseName IS NULL AND CheckID IN (2, 68) |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| #DBCCs | INSERT/UPDATE | DBCC DBINFO結果の格納 |

#### #DBCCs

| 操作 | 項目（カラム名） | 更新値 | 備考 |
|-----|-----------------|-------|------|
| INSERT | ParentObject | DBCC DBINFO出力から | - |
| INSERT | Object | DBCC DBINFO出力から | - |
| INSERT | Field | DBCC DBINFO出力から | dbi_LastLogBackupTime等 |
| INSERT | Value | DBCC DBINFO出力から | 日時値等 |
| UPDATE | DbName | 現在のデータベース名 | sp_MSforeachdb内で更新 |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 権限不足 | DBCC DBINFO実行権限がない | @sa = 0の場合、この処理自体がスキップされる |
| データベースアクセス不可 | 特定DBへのアクセス不可 | sp_MSforeachdbが該当DBをスキップ |

### リトライ仕様

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

## 配信設定

### レート制限

なし

### 配信時間帯

制限なし

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

- DBCC DBINFOはsysadmin権限を必要とする非公開コマンドです
- @sa = 0（非sysadmin）の場合、この処理全体がスキップされます
- 抽出されるデータには機密性の高い情報は含まれていません

## 備考

- DBCC DBINFOは非公開（undocumented）コマンドであり、将来のSQL Serverバージョンで変更される可能性があります
- sp_MSforeachdbを使用して全データベースを順次処理するため、データベース数が多い環境では時間がかかる場合があります
- AWS RDS環境ではDBCC DBINFOが実行できないため、この処理はスキップされます

---

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

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

### 推奨読解順序

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

DBCC DBINFO結果を格納する一時テーブルの構造を理解することが重要です。

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

**読解のコツ**: CREATE TABLE #DBCCs文を検索し、ParentObject, Object, Field, Valueの構造を確認します。

#### Step 2: 実行条件を理解する

DBCC DBINFO抽出処理の実行条件を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_Blitz.sql | `sp_Blitz.sql` | AWS RDSチェックと#SkipChecksの条件 |

**主要処理フロー**:
1. **行1269-1273**: AWS RDSチェック（CheckID = 223）
2. **行1274-1279**: #SkipChecksでCheckID 2,68のスキップ確認
3. **行1282**: RAISERROR('Extracting DBCC DBINFO data...')

#### Step 3: DBCC DBINFO実行処理を理解する

sp_MSforeachdbを使用したDBCC DBINFO実行処理を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sp_Blitz.sql | `sp_Blitz.sql` | sp_MSforeachdbによるDBCC DBINFO実行 |

**主要処理フロー**:
- **行1284-1292**: sp_MSforeachdb内でのDBCC DBINFO実行とデータ挿入

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

```
sp_Blitz
    |
    +-- (条件) NOT AWS RDS AND (Check 2 OR 68 有効)
            |
            +-- RAISERROR('Extracting DBCC DBINFO data...')
            |
            +-- sp_MSforeachdb
                    |
                    +-- USE [?]
                    |
                    +-- INSERT #DBCCs
                    |       |
                    |       +-- DBCC DBINFO() WITH TableResults, NO_INFOMSGS
                    |
                    +-- UPDATE #DBCCs SET DbName = N'?'
```

### データフロー図

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

各データベース        --> DBCC DBINFO()
                          |
                          +---> ParentObject
                          +---> Object
                          +---> Field (dbi_LastLogBackupTime等)    --> #DBCCs
                          +---> Value (日時値等)

sp_MSforeachdb        --> DbName更新                      --> #DBCCs.DbName
```

### 関連ファイル一覧

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