# 通知設計書 56-StopAtフルバックアップ時刻

## 概要

本ドキュメントは、sp_DatabaseRestore実行時に@StopAtパラメータがフルバックアップの終了時刻と一致する場合に発生する警告通知について定義する。

### 本通知の処理概要

sp_DatabaseRestoreはSQL Serverのデータベース復元を自動化するストアドプロシージャであり、@StopAtパラメータを使用して特定の時点への復元（ポイントインタイムリストア）を行うことができる。@StopAtがフルバックアップの終了時刻と完全に一致する場合、トランザクションログファイルの復元は行われない。この状況をユーザーに通知し、意図した動作であることを確認できるようにする。

**業務上の目的・背景**：ポイントインタイムリストアでは、まずフルバックアップを復元し、その後トランザクションログを順次適用して指定時点まで復元する。@StopAtがフルバックアップ終了時刻と一致する場合、ログ復元は不要となる。これは正常な動作だが、ユーザーが誤って@StopAtを設定した可能性もあるため、デバッグモードで情報を提供する。

**通知の送信タイミング**：sp_DatabaseRestore実行時に、@Debug = 1が設定されており、@BackupDateTime（フルバックアップの終了時刻）と@StopAt（復元目標時刻）が完全に一致する場合。

**通知の受信者**：sp_DatabaseRestoreを実行したSQL Serverユーザー（DBA、運用担当者など）。

**通知内容の概要**：@StopAtがフルバックアップの終了時刻であるため、ログファイルの復元は行われないことを通知する。

**期待されるアクション**：ユーザーは通知を確認し、(1) 意図した動作であれば処理を続行、(2) 誤りであれば@StopAtパラメータを修正してsp_DatabaseRestoreを再実行する。

## 通知種別

コンソール出力（RAISERROR WITH NOWAIT）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（RAISERROR WITH NOWAITによる即時出力） |
| 優先度 | 低（デバッグ情報、重大度0） |
| リトライ | なし |

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

sp_DatabaseRestoreを実行したセッションのメッセージ出力に直接表示される（@Debug = 1の場合のみ）。

## 通知テンプレート

### コンソール出力

| 項目 | 内容 |
|-----|------|
| 出力方法 | RAISERROR WITH NOWAIT（重大度0、状態1） |
| メッセージタイプ | 情報メッセージ |

### 本文テンプレート

```
@StopAt is the end time of a FULL backup, no log files will be restored.
```

### 添付ファイル

なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| なし | 固定メッセージのため変数なし | - | - |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| ストアドプロシージャ実行 | sp_DatabaseRestore実行 | @Debug = 1 AND @BackupDateTime = @StopAt | デバッグモードで@StopAtがフルバックアップ終了時刻と一致する場合 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| @Debug = 0 または @Debug IS NULL | デバッグモードが無効の場合 |
| @BackupDateTime <> @StopAt | @StopAtがフルバックアップ終了時刻と異なる場合 |
| @StopAt IS NULL | @StopAtが指定されていない場合 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[sp_DatabaseRestore実行] --> B{@StopAt指定?}
    B -->|No| Z[通常復元処理]
    B -->|Yes| C[フルバックアップ終了時刻取得]
    C --> D{@BackupDateTime = @StopAt?}
    D -->|No| E[ログファイル復元準備]
    D -->|Yes| F{@Debug = 1?}
    F -->|No| G[ログ復元スキップ（通知なし）]
    F -->|Yes| H[RAISERROR 警告メッセージ]
    H --> G
    G --> I[フルバックアップのみ復元]
    E --> J[ログファイル復元実行]
    I --> K[終了]
    J --> K
    Z --> K
```

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

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| @FileList（テーブル変数） | バックアップファイルリスト | バックアップファイルの時刻情報を含む |

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

#### @FileList

| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| BackupFile | バックアップファイル名 | フルバックアップ/ログファイルの判定 |
| BackupDateTime（推定） | バックアップ完了時刻 | @BackupDateTimeとの比較 |

### 更新テーブル一覧

なし

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| なし | 本通知は情報メッセージ | ログ復元をスキップして処理継続 |

### リトライ仕様

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

## 配信設定

### レート制限

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

### 配信時間帯

制限なし（sp_DatabaseRestore実行時に即時出力、@Debug = 1の場合のみ）

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

- 本通知には機密情報は含まれない
- バックアップ時刻情報は運用データとして扱われる

## 備考

- この通知は@Debug = 1の場合にのみ表示される
- @StopAtパラメータは14桁の数字形式（YYYYMMDDHHMMSS）で指定
- ログ復元がスキップされても、フルバックアップの復元は正常に行われる
- 完全にフルバックアップ終了時点への復元が必要な場合は、この動作は意図通り

---

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

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

### 推奨読解順序

#### Step 1: @StopAt比較ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | @BackupDateTimeと@StopAtの比較 |

**主要処理フロー**:
1. **行1372**: @BackupDateTimeと@StopAtの一致チェック
2. **行1374**: @Debug = 1の条件チェック
3. **行1376**: 警告メッセージの出力（RAISERROR WITH NOWAIT）

**読解のコツ**: このチェックは@StopAtパラメータが指定された後、ログファイル復元の前に行われる。@LogRecoveryOptionにSTOPATが追加された直後のロジック。

#### Step 2: ログファイル復元スキップを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | ログ復元スキップ時の処理 |

**主要処理フロー**:
- **行1379-1388**: @StopAtが一致しない場合のログファイル取得処理（ELSE節）
- **行1390-1394**: @ExtraLogFileがNULLの場合のログファイル削除

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

```
sp_DatabaseRestore (エントリーポイント)
    │
    ├─ [パラメータ検証] @StopAt形式チェック
    │
    ├─ [設定] @LogRecoveryOptionに', STOPAT = ...'を追加
    │
    ├─ [条件チェック] @BackupDateTime = @StopAt?
    │      │
    │      ├─ [Yes]
    │      │      │
    │      │      └─ [条件チェック] @Debug = 1?
    │      │             │
    │      │             ├─ [Yes] RAISERROR '@StopAt is the end time of a FULL backup...'
    │      │             │
    │      │             └─ [No] 通知なし
    │      │
    │      └─ [No] ログファイル復元準備
    │             └─ @ExtraLogFile取得
    │
    └─ [復元実行]
```

### データフロー図

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

@StopAt ─────────────────▶ [14桁形式検証]
                              │
                              ▼
                    [DATETIME変換]
                              │
                              ▼
@BackupDateTime ─────────▶ [一致チェック]
                              │
                    ┌─────────┴──────────┐
                    │                    │
                    ▼                    ▼
              [一致]                [不一致]
                    │                    │
                    ▼                    ▼
        @Debug = 1チェック        ログ復元準備
                    │
           ┌────────┴────────┐
           │                 │
           ▼                 ▼
      [Yes]             [No]
           │                 │
           ▼                 ▼
    RAISERROR出力     通知なし
           │                 │
           └────────┬────────┘
                    │
                    ▼
         ログ復元スキップ
         フルバックアップのみ復元
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | ソース | 本通知を発生させるメインプロシージャ（行1372-1378） |
| Install-All-Scripts.sql | `Install-All-Scripts.sql` | ソース | 全スクリプト一括インストール（行35717-35723に同一ロジック） |
