# 通知設計書 119-分割バックアップ検出

## 概要

本ドキュメントは、sp_DatabaseRestoreストアドプロシージャにおいて、分割バックアップ（複数ファイルに分割されたバックアップ）が検出された場合に出力されるデバッグメッセージの設計を定義します。

### 本通知の処理概要

sp_DatabaseRestore実行時に、フルバックアップ、差分バックアップ、またはログバックアップが複数のファイルに分割されている（ストライプバックアップ）ことを検出し、デバッグメッセージとして通知します。

**業務上の目的・背景**：大規模データベースでは、バックアップを複数のディスクやファイルに分割して並列書き込みを行うことでバックアップ時間を短縮する「ストライプバックアップ」が使用されます。sp_DatabaseRestoreは、このような分割バックアップを正しく認識し、すべての分割ファイルを指定したRESTORE文を生成する必要があります。この通知は、デバッグモードにおいて分割バックアップが検出されたことをDBAに伝え、生成されるRESTOREコマンドが複数のDISKオプションを含むことを事前に知らせます。

**通知の送信タイミング**：sp_DatabaseRestore実行時、@Debug = 1で、かつ分割バックアップ用の一時テーブル（#SplitFullBackups、#SplitDiffBackups、#SplitLogBackups）に複数のレコードが存在する場合に送信されます。

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

**通知内容の概要**：「Split backups found」というメッセージで、分割バックアップが検出されたことを伝えます。

**期待されるアクション**：デバッグ目的の通知であり、通常は特別なアクションは不要です。この通知後、生成されるRESTOREコマンドに複数のDISK=オプションが含まれることを確認できます。

## 通知種別

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

## 送信仕様

### 基本情報

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

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

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

## 通知テンプレート

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

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

### 本文テンプレート

```
Split backups found
```

### 添付ファイル

なし

## テンプレート変数

なし（固定メッセージ）

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| ストアドプロシージャ実行 | フル分割バックアップ検出 | @Debug = 1 AND COUNT(#SplitFullBackups) > 0 | フルバックアップが分割されている |
| ストアドプロシージャ実行 | 差分分割バックアップ検出 | @Debug = 1 AND COUNT(#SplitDiffBackups) > 0 | 差分バックアップが分割されている |
| ストアドプロシージャ実行 | ログ分割バックアップ検出 | @Debug = 1 AND COUNT(#SplitLogBackups) > 1 | ログバックアップが分割されている |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| @Debug = 0 | デバッグモードが無効の場合 |
| 分割バックアップなし | 各一時テーブルにレコードが存在しない場合 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[sp_DatabaseRestore実行] --> B[バックアップファイル検索]
    B --> C{フル分割バックアップあり?}
    C -->|Yes| D{@Debug = 1?}
    D -->|Yes| E[RAISERROR Split backups found]
    D -->|No| F[分割RESTORE文生成]
    E --> F
    C -->|No| G[単一RESTORE文生成]
    F --> H[差分バックアップ処理]
    G --> H
    H --> I{差分分割バックアップあり?}
    I -->|Yes| J{@Debug = 1?}
    J -->|Yes| K[RAISERROR Split backups found]
    J -->|No| L[分割RESTORE文生成]
    K --> L
    I -->|No| M[ログバックアップ処理]
    L --> M
    M --> N{ログ分割バックアップあり?}
    N -->|Yes| O{@Debug = 1?}
    O -->|Yes| P[RAISERROR Split backups found]
    O -->|No| Q[分割RESTORE文生成]
    P --> Q
```

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

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| #SplitFullBackups | フル分割バックアップ情報 | BackupPath, BackupFile |
| #SplitDiffBackups | 差分分割バックアップ情報 | BackupPath, BackupFile |
| #SplitLogBackups | ログ分割バックアップ情報 | BackupPath, BackupFile, DenseRank |

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

#### #SplitFullBackups / #SplitDiffBackups / #SplitLogBackups

| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| BackupPath | RESTOREコマンドのパス | - |
| BackupFile | RESTOREコマンドのファイル名 | ORDER BY BackupFile |
| DenseRank | ログバックアップのグループ化 | #SplitLogBackupsのみ |

### 更新テーブル一覧

なし（参照のみ）

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 該当なし | この通知はエラーではない | - |

### リトライ仕様

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

## 配信設定

### レート制限

なし

### 配信時間帯

制限なし

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

- デバッグ情報であるため、実運用環境での使用には注意が必要です
- バックアップファイルのパスやファイル名は含まれませんが、分割バックアップの存在が示されます

## 備考

- 同じメッセージがフルバックアップ、差分バックアップ、ログバックアップの処理でそれぞれ出力される可能性があります
- ログバックアップの場合、DenseRankを使用して同一セットの分割ファイルをグループ化します
- 生成されるRESTOREコマンドは、FROM DISK='file1', DISK='file2', ... の形式になります

---

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

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

### 推奨読解順序

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

分割バックアップ情報を格納する一時テーブルの構造を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | #SplitFullBackups、#SplitDiffBackups、#SplitLogBackupsの定義 |

**読解のコツ**: CREATE TABLE #SplitFullBackupsを検索し、BackupPath、BackupFileカラムの構造を確認します。

#### Step 2: フル分割バックアップ処理を理解する

フルバックアップの分割検出と通知処理を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | #SplitFullBackupsのカウントチェック |

**主要処理フロー**:
1. **行912**: IF (SELECT COUNT(*) FROM #SplitFullBackups) > 0
2. **行914**: IF @Debug = 1 RAISERROR('Split backups found', 0, 1)
3. **行916-924**: 分割RESTORE文の生成（STUFF関数使用）

#### Step 3: 差分分割バックアップ処理を理解する

差分バックアップの分割検出と通知処理を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | #SplitDiffBackupsのカウントチェック |

**主要処理フロー**:
- **行1105-1106**: IF (SELECT COUNT(*) FROM #SplitDiffBackups) > 0
- **行1107**: IF @Debug = 1 RAISERROR ('Split backups found', 0, 1)

#### Step 4: ログ分割バックアップ処理を理解する

ログバックアップの分割検出と通知処理を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | #SplitLogBackupsのカウントチェック |

**主要処理フロー**:
- **行1464-1465**: IF (SELECT COUNT(*) FROM #SplitLogBackups WHERE DenseRank = @LogRestoreRanking) > 1
- **行1466**: IF @Debug = 1 RAISERROR ('Split backups found', 0, 1)

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

```
sp_DatabaseRestore
    |
    +-- フルバックアップ復元処理
    |       |
    |       +-- (条件) COUNT(#SplitFullBackups) > 0
    |               |
    |               +-- (条件) @Debug = 1
    |               |       |
    |               |       +-- RAISERROR('Split backups found')
    |               |
    |               +-- 分割RESTORE DATABASE文生成
    |
    +-- 差分バックアップ復元処理
    |       |
    |       +-- (条件) COUNT(#SplitDiffBackups) > 0
    |               |
    |               +-- (条件) @Debug = 1
    |               |       |
    |               |       +-- RAISERROR('Split backups found')
    |               |
    |               +-- 分割RESTORE DATABASE文生成
    |
    +-- ログバックアップ復元処理（ループ）
            |
            +-- (条件) COUNT(#SplitLogBackups WHERE DenseRank = N) > 1
                    |
                    +-- (条件) @Debug = 1
                    |       |
                    |       +-- RAISERROR('Split backups found')
                    |
                    +-- 分割RESTORE LOG文生成
```

### データフロー図

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

バックアップファイル一覧 --> #SplitFullBackups
                             #SplitDiffBackups
                             #SplitLogBackups
                                    |
                                    v
COUNT(*) > 0             --> 分割検出判定
                                    |
                                    +---> (検出) RAISERROR 'Split backups found'
                                    |
                                    v
BackupPath + BackupFile  --> STUFF(FOR XML PATH) --> @sql (複数DISK=指定)
                                    |
                                    v
                            RESTORE DATABASE/LOG FROM DISK='..',DISK='..'
```

### 関連ファイル一覧

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