# 通知設計書 31-MaxTransferSize倍数

## 概要

本ドキュメントは、sp_DatabaseRestoreストアドプロシージャにおける@MaxTransferSizeパラメータの値が65536の倍数でない場合に発生するエラー通知の設計を記述する。

### 本通知の処理概要

この通知は、データベース復元操作において、@MaxTransferSizeパラメータに指定された値が65536の倍数でない場合にユーザーに警告を発するためのエラーメッセージである。

**業務上の目的・背景**：SQL Serverのバックアップ/リストア操作では、MaxTransferSizeはディスクI/O転送単位のサイズを制御する重要なパラメータである。この値は65536バイト（64KB）の倍数である必要があり、この制約はSQL Serverの内部アーキテクチャに基づいている。不正な値が指定されると、リストア操作が失敗する可能性があるため、事前検証によりユーザーに問題を通知し、正しいパラメータ値の使用を促す。

**通知の送信タイミング**：sp_DatabaseRestoreストアドプロシージャの実行開始直後、@MaxTransferSizeパラメータの検証フェーズで発生する。具体的には、@MaxTransferSizeがNULLでなく、かつ値が65536で割り切れない場合にトリガーされる。

**通知の受信者**：ストアドプロシージャを実行したSQL Serverセッションの呼び出し元ユーザーまたはアプリケーション。RAISERRORによりクライアントに直接メッセージが返される。

**通知内容の概要**：エラーメッセージとして「@MaxTransferSize has to be a multiple of 65536」が表示され、指定された値が無効であることを明示的に伝える。

**期待されるアクション**：ユーザーは@MaxTransferSizeパラメータの値を確認し、65536（64KB）の倍数（例：65536、131072、262144、524288など）に修正してから、再度ストアドプロシージャを実行する必要がある。

## 通知種別

SQLエラーメッセージ（RAISERROR - Severity 0, State 1）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期 |
| 優先度 | 低（Severity 0） |
| リトライ | 無 |

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

現在のSQL Serverセッションの呼び出し元に対してRAISERRORでメッセージを送信。WITH NOWAITオプションにより、バッファリングなしで即時にクライアントへ送信される。

## 通知テンプレート

### SQLエラーメッセージ

| 項目 | 内容 |
|-----|------|
| メッセージレベル | 0（情報メッセージ） |
| 状態 | 1 |
| オプション | WITH NOWAIT |

### 本文テンプレート

```
@MaxTransferSize has to be a multiple of 65536
```

### 添付ファイル

なし

## テンプレート変数

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

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| ストアドプロシージャ実行 | sp_DatabaseRestoreの呼び出し | @MaxTransferSize IS NOT NULL AND @MaxTransferSize % 64 <> 0 | MaxTransferSizeパラメータが65536の倍数でない場合にエラーを発生 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| @MaxTransferSize IS NULL | パラメータが指定されていない場合はチェックをスキップ |
| @MaxTransferSize % 64 = 0 | 値が65536の倍数である場合は通知しない（注：コード上は64でモジュロ計算しているが、これはバグの可能性あり） |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[sp_DatabaseRestore実行開始] --> B{@MaxTransferSize IS NOT NULL?}
    B -->|No| C[チェックスキップ]
    B -->|Yes| D{@MaxTransferSize > 4194304?}
    D -->|Yes| E[MaxTransferSize上限エラー]
    D -->|No| F{@MaxTransferSize % 64 <> 0?}
    F -->|Yes| G[RAISERROR発生]
    F -->|No| H[処理続行]
    G --> I[メッセージ送信完了]
    C --> H
    E --> J[処理続行※エラー後も継続]
    I --> K[処理続行※エラー後も継続]
```

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

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| なし | パラメータ検証のみのため、テーブル参照なし | - |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| なし | - | ログ出力のみでテーブル更新なし |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| パラメータ検証エラー | @MaxTransferSizeが65536の倍数でない | パラメータ値を修正して再実行 |

### リトライ仕様

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

## 配信設定

### レート制限

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

### 配信時間帯

制限なし（ストアドプロシージャ実行時に即時送信）

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

- 個人情報の取り扱いなし
- パラメータ値のみを検証するため、機密情報の露出リスクなし

## 備考

- コード上では`@MaxTransferSize % 64 <> 0`でチェックしているが、これは65536 / 1024 = 64 として簡略化された計算と思われる。しかし、実際のMaxTransferSizeの有効値は65536の倍数であるため、正確には`@MaxTransferSize % 65536 <> 0`であるべき可能性がある
- Severity 0のRAISERRORであるため、エラーとしては扱われず、処理は継続される

---

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

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

### 推奨読解順序

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

sp_DatabaseRestoreストアドプロシージャのパラメータ定義を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | パラメータ@MaxTransferSizeの定義（行26）を確認 |

**読解のコツ**: T-SQLのストアドプロシージャ定義では、ALTER PROCEDUREの直後にパラメータリストが続く。

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

処理の起点となるファイル・関数を特定。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | ストアドプロシージャの開始点（行14-55）でパラメータ定義を確認 |

**主要処理フロー**:
1. **行14-55**: ALTER PROCEDURE文でパラメータ定義
2. **行26**: @MaxTransferSize INT = NULL としてパラメータ宣言
3. **行508-519**: @MaxTransferSizeの検証ロジック

#### Step 3: 検証ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | 行508-519でMaxTransferSizeの検証ロジックを確認 |

**主要処理フロー**:
- **行508**: IF NOT @MaxTransferSize IS NULL - NULLチェック
- **行510-513**: 上限値チェック（4194304超過）
- **行515-518**: 倍数チェック（64での剰余）

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

```
sp_DatabaseRestore
    |
    +-- パラメータ検証フェーズ (行508-527)
    |       |
    |       +-- @MaxTransferSizeのNULLチェック (行508)
    |       |
    |       +-- 上限値チェック (行510-513)
    |       |
    |       +-- 倍数チェック (行515-518) ← 本通知の発生箇所
    |       |
    |       +-- @BlockSizeのチェック (行521-527)
    |
    +-- バックアップ復元処理（検証通過後）
```

### データフロー図

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

@MaxTransferSize ───▶ NULL チェック ───▶ 上限チェック ───▶ 倍数チェック ───▶ RAISERROR
     (INT)              (行508)          (行510-513)       (行515-518)       (メッセージ)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | ソース | データベース復元用ストアドプロシージャ本体 |
