# 通知設計書 120-復元ログなし

## 概要

本ドキュメントは、sp_DatabaseRestoreストアドプロシージャにおいて、復元すべきトランザクションログバックアップが存在しない場合に出力されるデバッグメッセージの設計を定義します。

### 本通知の処理概要

sp_DatabaseRestore実行時に、データベースの復元処理においてトランザクションログバックアップの復元が不要（または該当ログがない）場合に、デバッグメッセージとして通知します。

**業務上の目的・背景**：sp_DatabaseRestoreは、フルバックアップ、差分バックアップ、そしてトランザクションログバックアップを順次復元してデータベースを特定の時点まで回復します。しかし、いくつかの状況ではログ復元が不要または不可能な場合があります：SIMPLEリカバリモデルのデータベース、@StopAtがフルバックアップ時刻と一致する場合、またはログバックアップが存在しない場合などです。この通知は、デバッグモードにおいてログ復元処理がスキップされることをDBAに伝え、復元処理の完了状態を理解する助けとなります。

**通知の送信タイミング**：sp_DatabaseRestore実行時、ログバックアップ復元ループの初期状態（@i = 1）で、復元すべきログが存在しない場合に送信されます。

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

**通知内容の概要**：「No Log to Restore」というメッセージで、トランザクションログの復元が不要であることを伝えます。

**期待されるアクション**：デバッグ目的の通知であり、通常は特別なアクションは不要です。ログ復元が必要なのにこの通知が表示された場合は、ログバックアップファイルの存在やパス設定を確認してください。

## 通知種別

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

## 送信仕様

### 基本情報

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

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

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

## 通知テンプレート

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

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

### 本文テンプレート

```
No Log to Restore
```

### 添付ファイル

なし

## テンプレート変数

なし（固定メッセージ）

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| ストアドプロシージャ実行 | ログ復元不要判定 | @Debug = 1 AND @i = 1 | ログ復元ループの初期状態でログなし |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| @Debug = 0 | デバッグモードが無効の場合 |
| @i = 2 | ログ復元処理中の場合（ログあり） |
| ログバックアップあり | 復元対象のログが存在する場合 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[sp_DatabaseRestore実行] --> B[フルバックアップ復元]
    B --> C[差分バックアップ復元（存在する場合）]
    C --> D[ログ復元ループ開始]
    D --> E{@i = 1?}
    E -->|Yes| F{@Debug = 1?}
    F -->|Yes| G[RAISERROR No Log to Restore]
    F -->|No| H[ログ復元なしで終了]
    G --> H
    E -->|No @i = 2| I[ログ復元処理実行]
    I --> J[次のログへ]
    J --> D
```

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

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| #Headers | バックアップヘッダー情報 | BackupType = 2（ログ）の確認 |

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

#### #Headers

| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| BackupType | バックアップ種別判定 | = 2（ログバックアップ） |
| BackupStartDate | 復元順序決定 | ORDER BY |

### 更新テーブル一覧

なし（この通知時点ではログ復元なし）

## エラー処理

### エラーケース一覧

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

### リトライ仕様

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

## 配信設定

### レート制限

なし

### 配信時間帯

制限なし

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

- デバッグ情報であるため、実運用環境での使用には注意が必要です
- バックアップ情報の詳細は含まれていません

## 備考

- @i変数は復元処理の状態を示します：
  - @i = 1: ログ復元の初期状態（ログなし）
  - @i = 2: ログ復元処理中
- この通知が出力される典型的なシナリオ：
  - SIMPLEリカバリモデルのデータベース復元
  - ログバックアップファイルが存在しない
  - @StopAtパラメータがフルバックアップ完了時刻と同じ
  - @ContinueLogs = 1で既にログが適用済み
- 警告56（StopAtフルバックアップ時刻）との組み合わせで発生することがあります

---

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

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

### 推奨読解順序

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

ログバックアップ復元の状態管理を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | @i変数の宣言と初期値 |

**読解のコツ**: @i変数の使用箇所を追跡し、1と2の値がどのような状態を表すかを理解します。

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

ログ復元ループとNo Log to Restore判定を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | ログ復元WHILEループの開始部分 |

**主要処理フロー**:
1. **行1455-1458**: IF @i = 1 BEGIN ... RAISERROR('No Log to Restore', 0, 1)
2. **行1460-1489**: IF @i = 2 BEGIN ... ログ復元処理

#### Step 3: @i変数の状態遷移を理解する

@i変数がどのように1から2に変化するかを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | @i = 2への設定箇所 |

**主要処理フロー**:
- ログバックアップが存在する場合、処理の途中で@iが2に設定される
- @i = 1のままループを抜ける場合、ログ復元は行われない

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

```
sp_DatabaseRestore
    |
    +-- フルバックアップ復元
    |
    +-- 差分バックアップ復元（オプション）
    |
    +-- ログ復元ループ
            |
            +-- (条件) @i = 1
            |       |
            |       +-- (条件) @Debug = 1
            |       |       |
            |       |       +-- RAISERROR('No Log to Restore')
            |       |
            |       +-- ログ復元なしでループ終了
            |
            +-- (条件) @i = 2
                    |
                    +-- ログ復元処理実行
                    |
                    +-- @LogRestoreRanking += 1
```

### データフロー図

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

#Headers (BackupType = 2) --> ログ存在チェック
                                    |
                                    +---> (なし) @i = 1 維持
                                    |         |
                                    |         v
                                    |     @Debug = 1 ?
                                    |         |
                                    |         +---> RAISERROR 'No Log to Restore'
                                    |
                                    +---> (あり) @i = 2 設定
                                              |
                                              v
                                          ログ復元処理
```

### 関連ファイル一覧

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