# 通知設計書 36-認証エラー

## 概要

本ドキュメントは、sp_DatabaseRestoreストアドプロシージャにおいて、ネットワーク共有パスへのアクセス時にユーザー名またはパスワードが正しくない場合に発生するエラー通知の設計を記述する。

### 本通知の処理概要

この通知は、データベース復元操作において、xp_cmdshellを使用したフォルダ列挙時に、ネットワーク共有へのアクセスで認証が失敗した場合にユーザーに警告を発するためのエラーメッセージである。

**業務上の目的・背景**：データベースの復元処理でネットワーク共有（UNCパス）からバックアップファイルを読み取る際、SQL Serverサービスアカウントがネットワークリソースに認証できなければ復元操作は不可能である。この通知により、ユーザーは認証設定の問題を早期に検出し、適切な資格情報の設定を行うことができる。特にドメイン環境やワークグループ間でのファイル共有時に発生しやすい。

**通知の送信タイミング**：sp_DatabaseRestoreストアドプロシージャの実行中、バックアップファイル一覧の取得処理（SimpleFolderEnumeration = 0、xp_cmdshellモード）で発生する。DIRコマンドの結果が「The user name or password is incorrect.」を含む場合にトリガーされる。

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

**通知内容の概要**：エラーメッセージとして「(FULL) Incorrect user name or password for %s」が表示され、具体的なパスを明示してどのネットワークリソースへの認証が失敗したかを伝える。

**期待されるアクション**：ユーザーまたはシステム管理者は、SQL Serverサービスアカウントの資格情報を確認し、ネットワーク共有へのアクセス権限を適切に設定する必要がある。サービスアカウントの変更、共有フォルダの認証設定の確認、またはcredentialの設定が必要となる場合がある。

## 通知種別

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

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期 |
| 優先度 | 高（Severity 16） |
| リトライ | 無（処理即時終了） |

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

現在のSQL Serverセッションの呼び出し元に対してRAISERRORでメッセージを送信。WITH NOWAITオプションにより即時送信され、その後RETURNにより処理が終了する。

## 通知テンプレート

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

| 項目 | 内容 |
|-----|------|
| メッセージレベル | 16（ユーザーエラー） |
| 状態 | 1 |
| オプション | WITH NOWAIT |

### 本文テンプレート

```
(FULL) Incorrect user name or password for %s
```

### 添付ファイル

なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| %s | バックアップパス | @CurrentBackupPathFull | Yes |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| ストアドプロシージャ実行 | sp_DatabaseRestoreの呼び出し | @SimpleFolderEnumeration = 0 AND fl.BackupFile = 'The user name or password is incorrect.' | xp_cmdshellモードで認証エラーが検出された場合にエラーを発生 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| @SimpleFolderEnumeration = 1 | xp_dirtreeモードではこのチェックは実行されない |
| 認証成功 | DIRコマンドが正常にファイル一覧を返した場合は通知しない |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[sp_DatabaseRestore実行開始] --> B[バックアップパス設定]
    B --> C{@SimpleFolderEnumeration = 0?}
    C -->|Yes| D[xp_cmdshellでDIRコマンド実行]
    C -->|No| E[xp_dirtreeモードへ]
    D --> F[@FileListに結果挿入]
    F --> G{BackupFile = 認証エラーメッセージ?}
    G -->|Yes| H[RAISERROR発生]
    G -->|No| I[処理続行]
    H --> J[RETURN - 処理終了]
```

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

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| sys.configurations | xp_cmdshellの有効/無効確認 | SimpleFolderEnumerationの自動設定に使用 |

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

#### sys.configurations

| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| name | 設定名の確認 | WHERE name = 'xp_cmdshell' |
| value_in_use | xp_cmdshellの有効状態 | 値が1の場合にxp_cmdshellモードを使用 |

### 更新テーブル一覧

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

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 認証エラー | ネットワーク共有への認証が失敗 | サービスアカウントの資格情報を確認・修正 |
| パスワード期限切れ | サービスアカウントのパスワードが期限切れ | パスワードを更新 |
| 信頼関係の問題 | ドメイン間の信頼関係が確立されていない | ドメイン管理者に連絡 |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0（リトライなし、即座に処理終了） |
| リトライ間隔 | - |
| リトライ対象エラー | - |

## 配信設定

### レート制限

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

### 配信時間帯

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

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

- エラーメッセージにファイルパスが含まれるため、パス情報が露出する
- 認証エラーの情報は、セキュリティ監査および侵入検知の観点から重要
- 認証エラーが頻発する場合は、不正アクセス試行の可能性を考慮
- サービスアカウントの資格情報は安全に管理すること

## 備考

- このエラーはxp_cmdshellモード（SimpleFolderEnumeration = 0）でのみ発生
- ネットワーク共有（UNCパス）を使用する場合に特に関連
- メッセージの先頭に「(FULL)」が付与されており、フルバックアップ関連のエラーであることを示す
- DIFF、LOGパスでも同様のチェックが行われる（行1064-1072、行1273-1281）
- Windowsの認証エラーメッセージ「The user name or password is incorrect.」をそのまま検出している

---

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

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

### 推奨読解順序

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

xp_cmdshellの結果を格納するテーブル変数の構造を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | @FileListテーブル変数の定義（行285-288）を確認 |

**読解のコツ**: xp_cmdshellはWindows OSのエラーメッセージをそのまま1行として返す特性を理解する。

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

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | xp_cmdshellによるDIR実行（行604-612）を確認 |

**主要処理フロー**:
1. **行604**: DIRコマンドの構築
2. **行610**: xp_cmdshellの実行と結果挿入

#### Step 3: エラー検出ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | 行664-672で認証エラーチェックを確認 |

**主要処理フロー**:
- **行664-668**: BackupFileが'The user name or password is incorrect.'かどうかをカウント
- **行670**: RAISERROR発生
- **行671**: RETURN - 処理終了

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

```
sp_DatabaseRestore
    |
    +-- パラメータ検証フェーズ
    |
    +-- バックアップファイル列挙フェーズ (行589-674)
    |       |
    |       +-- パスループ開始 (行589)
    |       |
    |       +-- SimpleFolderEnumeration判定 (行596)
    |       |       |
    |       |       +-- xp_cmdshell使用時 (行602-612)
    |       |               |
    |       |               +-- DIR コマンド構築 (行604)
    |       |               |
    |       |               +-- xp_cmdshell実行 (行610)
    |       |
    |       +-- エラーチェック (行628-673)
    |               |
    |               +-- パス不存在チェック (行631-640)
    |               |
    |               +-- アクセス拒否チェック (行641-649)
    |               |
    |               +-- 空ディレクトリチェック (行650-663)
    |               |
    |               +-- 認証エラーチェック (行664-672) ← 本通知の発生箇所
    |
    +-- バックアップ復元処理（チェック通過時）
```

### データフロー図

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

@BackupPathFull ───▶ DIR コマンド構築 ───▶ xp_cmdshell実行
（UNCパス）             (行604)              (行610)
                                                 |
                                                 v
                                           @FileList挿入
                                                 |
                                                 v
                            'The user name or password...' チェック ───▶ RAISERROR
                                           (行664-668)                   (メッセージ)
```

### 関連ファイル一覧

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