# 通知設計書 99-ドライブ設定

## 概要

本ドキュメントは、sp_DatabaseRestoreストアドプロシージャにおける「ドライブ設定」通知メッセージの設計を定義する。この通知は、データファイルおよびログファイルの移動先ドライブのデフォルト値取得処理の進行状況を示す情報メッセージである。

### 本通知の処理概要

**業務上の目的・背景**：sp_DatabaseRestoreはバックアップファイルからデータベースを復元する際、データファイルとログファイルの配置先を指定できる。@MoveDataDriveや@MoveLogDriveが指定されていない場合、SQL Serverインスタンスのデフォルトデータ/ログパスを自動的に取得して使用する。この通知は、デフォルトドライブ設定の取得処理を管理者に通知する。

**通知の送信タイミング**：sp_DatabaseRestore実行時、@MoveDataDriveまたは@MoveLogDriveがNULLまたは空の場合に、デフォルトパス取得処理の実行時に送信される。

**通知の受信者**：SQLクライアント（SSMS、sqlcmd、アプリケーション）を通じてストアドプロシージャを実行している管理者またはオペレータ。RAISERROR WITH NOWAITにより即座にメッセージが出力される。

**通知内容の概要**：デフォルトドライブ設定の取得を示すメッセージ。「Getting default data drive for @MoveDataDrive」または「Getting default log drive for @MoveLogDrive」という形式で出力される。

**期待されるアクション**：基本的に確認のみ。デフォルトパスが意図したものと異なる場合は、@MoveDataDriveや@MoveLogDriveパラメータを明示的に指定する。

## 通知種別

RAISERROR情報メッセージ（SQLクライアント出力）

## 送信仕様

### 基本情報

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

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

RAISERROR WITH NOWAITによりSQL Serverクライアントへ即座にメッセージを送信。接続中のすべてのクライアントセッションで受信可能。

## 通知テンプレート

### メッセージ出力の場合

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

### 本文テンプレート

```
Getting default data drive for @MoveDataDrive
Getting default log drive for @MoveLogDrive
Setting default data drive for @MoveFilestreamDrive
Setting default data drive for @MoveFullTextCatalogDrive
```

### 添付ファイル

該当なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| パラメータ名 | 設定対象のパラメータ | @MoveDataDrive, @MoveLogDrive等 | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| ストアドプロシージャ実行 | デフォルトドライブ取得 | 対象パラメータがNULLまたは空 | デフォルト値取得の実行を通知 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| パラメータが明示的に指定されている | デフォルト取得不要のため通知なし |
| @Execute = 'N' かつ @Debug = 0 | 実行モードでない場合はスキップ |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[sp_DatabaseRestore実行開始] --> B[パラメータ検証]
    B --> C{@MoveDataDrive = NULL?}
    C -->|Yes| D[RAISERROR: Getting default data drive]
    C -->|No| E[次のパラメータへ]
    D --> F[SERVERPROPERTY InstanceDefaultDataPath取得]
    F --> E
    E --> G{@MoveLogDrive = NULL?}
    G -->|Yes| H[RAISERROR: Getting default log drive]
    G -->|No| I[次のパラメータへ]
    H --> J[SERVERPROPERTY InstanceDefaultLogPath取得]
    J --> I
    I --> K{@MoveFilestreamDrive = NULL?}
    K --> L[同様の処理]
    L --> M[復元処理へ]
```

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

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| なし | SERVERPROPERTYのみ使用 | - |

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

#### SERVERPROPERTY

| 参照項目（プロパティ名） | 用途 | 取得条件 |
|-------------------|------|---------|
| InstanceDefaultDataPath | デフォルトデータファイルパス | @MoveDataDrive, @MoveFilestreamDrive, @MoveFullTextCatalogDrive用 |
| InstanceDefaultLogPath | デフォルトログファイルパス | @MoveLogDrive用 |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| なし | パラメータ変数の更新のみ | - |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| なし | デフォルトパス取得自体はエラーを発生させない | - |

### リトライ仕様

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

## 配信設定

### レート制限

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

### 配信時間帯

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

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

- SERVERPROPERTYの参照にはVIEW SERVER STATE権限が必要な場合がある
- RAISERRORメッセージ自体には機密情報は含まれない

## 備考

- SQL Server 2012以降でSERVERPROPERTY('InstanceDefaultDataPath')が使用可能
- @MoveFilestreamDriveと@MoveFullTextCatalogDriveもデフォルトデータパスを使用
- パス取得後、末尾スラッシュの自動修正も行われる

---

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

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

### 推奨読解順序

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

ドライブ設定対象のパラメータを理解する。

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

**読解のコツ**: @MoveDataDrive、@MoveLogDrive、@MoveFilestreamDrive、@MoveFullTextCatalogDriveがNVARCHAR(260)として定義されている。

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

ドライブ設定処理の開始点を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | ドライブ設定処理（行427-489）を確認 |

**主要処理フロー**:
1. **行427-430**: @MoveDataDriveのNULLチェックとデフォルト取得
2. **行443-446**: @MoveLogDriveのNULLチェックとデフォルト取得
3. **行459-462**: @MoveFilestreamDriveのNULLチェックとデフォルト取得
4. **行475-478**: @MoveFullTextCatalogDriveのNULLチェックとデフォルト取得

#### Step 3: SERVERPROPERTY呼び出しを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | SERVERPROPERTYの使用方法を確認 |

**主要処理フロー**:
- **行430**: `SERVERPROPERTY('InstanceDefaultDataPath')`でデータパス取得
- **行446**: `SERVERPROPERTY('InstanceDefaultLogPath')`でログパス取得
- **行462, 478**: FilestreamとFullTextCatalogはデータパスを使用

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

```
sp_DatabaseRestore
    |
    +-- [パラメータ検証]
    |
    +-- [ドライブ設定処理]
           |
           +-- @MoveDataDrive設定
           |      +-- NULLIF(@MoveDataDrive, '') IS NULLチェック
           |      +-- RAISERROR 'Getting default data drive for @MoveDataDrive'  <-- 本通知
           |      +-- SERVERPROPERTY('InstanceDefaultDataPath')取得
           |
           +-- @MoveLogDrive設定
           |      +-- NULLIF(@MoveLogDrive, '') IS NULLチェック
           |      +-- RAISERROR 'Getting default log drive for @MoveLogDrive'  <-- 本通知
           |      +-- SERVERPROPERTY('InstanceDefaultLogPath')取得
           |
           +-- @MoveFilestreamDrive設定
           |      +-- RAISERROR 'Setting default data drive for @MoveFilestreamDrive'
           |      +-- SERVERPROPERTY('InstanceDefaultDataPath')取得
           |
           +-- @MoveFullTextCatalogDrive設定
                  +-- RAISERROR 'Setting default data drive for @MoveFullTextCatalogDrive'
                  +-- SERVERPROPERTY('InstanceDefaultDataPath')取得
```

### データフロー図

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

@MoveDataDrive = NULL ──▶ SERVERPROPERTY取得 ──▶ InstanceDefaultDataPath
                               |
                               ▼
                         RAISERROR出力 ────────────────────▶ SQLクライアント
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | ソース | データベース復元の本体プロシージャ。ドライブ設定処理を含む |
