# 機能設計書 247-Test-DbaDbRecoveryModel

## 概要

本ドキュメントは、データベースが設定された回復モデルで実際に動作しているかを検証する機能 `Test-DbaDbRecoveryModel` の設計仕様を記載する。

### 本機能の処理概要

この機能は、データベースを完全（FULL）回復モデルに切り替えた場合、ログバックアップチェーンを開始するための完全バックアップが取得されるまで、単純（SIMPLE）回復モデルのように動作することを検出する。設定された回復モデルと実際の回復モデル動作のギャップを特定する。

**業務上の目的・背景**：FULL回復モデルのデータベースでは、sys.database_recovery_statusのlast_log_backup_lsnを確認し、ログバックアップチェーンが確立されているかをチェックする。この値がないデータベースは、FULL回復モデルとして設定されていても、機能的にはSIMPLEモードで動作している。この検証は、ポイントインタイムリカバリ機能が実際に利用可能かどうかを確認するために重要。

**機能の利用シーン**：
- ディザスタリカバリ計画の検証
- バックアップ戦略の妥当性確認
- FULL回復モデル設定後のログバックアップチェーン確立確認
- SIMPLE/BULK_LOGGED回復モデルの監査

**主要な処理内容**：
1. 指定されたSQL Serverインスタンスに接続（SQL Server 2005以上）
2. 指定された回復モデルのデータベースを抽出
3. FULL回復モデルの場合、last_log_backup_lsnの存在確認
4. 設定された回復モデルと実際の回復モデルを比較して出力

**関連システム・外部連携**：sys.databasesおよびsys.database_recovery_statusシステムビュー。

**権限による制御**：データベースへのアクセス権限が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 28 | リカバリモデル | 補助機能 | リカバリモデルのテスト |

## 機能種別

バリデーション / 診断処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | Yes | ターゲットSQL Serverインスタンス | SQL Server 2005以上 |
| Database | object[] | No | チェック対象データベース | - |
| ExcludeDatabase | object[] | No | 除外するデータベース | - |
| SqlCredential | PSCredential | No | 代替資格情報 | 有効なPowerShell資格情報 |
| RecoveryModel | string | No | 検証対象の回復モデル | Full, Simple, Bulk_Logged |
| EnableException | switch | No | 例外のスロー有効化 | - |

### 入力データソース

- PowerShellコマンドライン引数
- パイプライン入力（SqlInstance）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverインスタンスのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名（computer\instance形式） |
| Database | string | 検証対象のデータベース名 |
| ConfiguredRecoveryModel | string | データベースに設定された回復モデル（FULL、SIMPLE、またはBULK_LOGGED） |
| ActualRecoveryModel | string | 実際の動作回復モデル（設定と異なる場合あり） |

### 出力先

- PowerShellパイプライン出力（PSCustomObject）

## 処理フロー

### 処理シーケンス

```
1. beginブロックで初期化
   └─ RecoveryModelパラメータのデフォルト設定（Full）
   └─ 回復モデルコードへの変換
   └─ SQLクエリの構築
2. processブロックで各インスタンス処理
   └─ Connect-DbaInstance（MinimumVersion 9）で接続
   └─ SQLクエリ実行
   └─ 結果の解析と出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[RecoveryModelデフォルト設定]
    B --> C[回復モデルコード変換]
    C --> D[SQLクエリ構築]
    D --> E{各インスタンスをループ}
    E --> F[Connect-DbaInstance MinimumVersion 9]
    F --> G{接続成功?}
    G -->|No| H[Stop-Function]
    H --> E
    G -->|Yes| I[SQLクエリ実行]
    I --> J{結果あり?}
    J -->|No| K[Verbose メッセージ]
    J -->|Yes| L{各行をループ}
    K --> E
    L --> M{FULL回復モデル?}
    M -->|Yes| N{last_log_backup_lsn有り?}
    N -->|Yes| O[ActualRecoveryModel = FULL]
    N -->|No| P[ActualRecoveryModel = SIMPLE]
    M -->|No| Q[ActualRecoveryModel = RecoveryModel]
    O --> R[結果出力]
    P --> R
    Q --> R
    R --> L
    L -->|完了| E
    E -->|完了| S[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-247-1 | デフォルト回復モデル | RecoveryModel未指定時はFullを使用 | RecoveryModelパラメータなしの場合 |
| BR-247-2 | FULL回復モデル検証 | last_log_backup_lsnが存在しない場合、実際はSIMPLE動作 | RecoveryModel = Full の場合 |
| BR-247-3 | その他の回復モデル | ConfiguredとActualは同じ値を報告 | RecoveryModel = Simple/Bulk_Logged の場合 |

### 回復モデルコード

| 回復モデル | コード |
|-----------|--------|
| Full | 1 |
| Bulk_Logged | 2 |
| Simple | 3 |

### 計算ロジック

実際の回復モデル判定：
```powershell
if (!([bool]$row.IsReallyInFullRecoveryModel) -and $RecoveryModel -eq 'Full') {
    $ActualRecoveryModel = "SIMPLE"
} else {
    $ActualRecoveryModel = "$($RecoveryModel.ToString().ToUpper())"
}
```

## データベース操作仕様

### 操作別データベース影響一覧

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 回復モデル取得 | sys.databases | SELECT | データベースの回復モデル設定を取得 |
| 回復状態取得 | sys.database_recovery_status | SELECT | ログバックアップチェーン状態を取得 |

### テーブル別操作詳細

#### sys.databases / sys.database_recovery_status

| 操作 | 項目（カラム名） | 取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | name, recovery_model, recovery_model_desc | recovery_model = $recoveryCode | 指定された回復モデルのDBのみ |
| SELECT | last_log_backup_lsn | database_id = d.database_id | FULL回復モデル検証用 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| ConnectionError | 接続エラー | インスタンスへの接続失敗 | Stop-Functionで処理継続 |
| QueryError | クエリエラー | SQLクエリ実行失敗 | Stop-Functionで処理継続 |

### リトライ仕様

リトライ処理なし。各インスタンスに対してContinueでループを継続。

## トランザクション仕様

読み取り専用操作のため、トランザクション管理は不要。

## パフォーマンス要件

- システムビューへの直接クエリで軽量
- データベース数に応じて結果行数が増加

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

- SQL Server認証、Windows認証、Active Directory認証をサポート
- システムビューへのアクセス権限が必要
- MFAサポートが必要な場合はConnect-DbaInstanceの事前使用を推奨

## 備考

- Paul Randalの投稿を参考: http://www.sqlskills.com/blogs/paul/new-script-is-that-database-really-in-the-full-recovery-mode/
- FULL回復モデルでログバックアップチェーンが確立されていない場合、ポイントインタイムリカバリは不可能
- SQL Server 2005以上が必要（MinimumVersion 9）

---

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

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

### 推奨読解順序

#### Step 1: コマンド構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Test-DbaDbRecoveryModel.ps1 | `public/Test-DbaDbRecoveryModel.ps1` | パラメータ定義、コメントベースヘルプ |

**読解のコツ**: ValidateSet属性によるRecoveryModelパラメータの制限に注目。

#### Step 2: beginブロックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Test-DbaDbRecoveryModel.ps1 | `public/Test-DbaDbRecoveryModel.ps1` | 初期化処理、SQLクエリ構築 |

**主要処理フロー**:
1. **103-105行目**: RecoveryModelのデフォルト設定
2. **107-111行目**: 回復モデルコードへの変換
3. **113-126行目**: SQLクエリの構築
4. **128-135行目**: データベースフィルタの追加

#### Step 3: processブロックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Test-DbaDbRecoveryModel.ps1 | `public/Test-DbaDbRecoveryModel.ps1` | クエリ実行と結果処理 |

**主要処理フロー**:
1. **142-147行目**: インスタンスへの接続
2. **149-154行目**: SQLクエリ実行
3. **156-171行目**: 結果の解析と出力（ActualRecoveryModelの決定）

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

```
Test-DbaDbRecoveryModel
    │
    ├─ Connect-DbaInstance
    │      └─ SQL Server SMO接続（MinimumVersion 9）
    │
    ├─ $server.Query($sql)
    │      └─ sys.databases
    │      └─ sys.database_recovery_status
    │
    └─ Select-DefaultView
           └─ 出力プロパティフィルタリング
```

### データフロー図

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

SqlInstance    ───▶ Connect-DbaInstance ───▶ $server
                           │
RecoveryModel  ───▶ 回復モデルコード変換 ───▶ SQLクエリ
                           │
                           ▼
                    sys.databases +
                    sys.database_recovery_status ───▶ 結果行
                           │
                           ▼
                    ActualRecoveryModel判定 ───▶ PSCustomObject
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Test-DbaDbRecoveryModel.ps1 | `public/Test-DbaDbRecoveryModel.ps1` | ソース | メイン機能実装 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続処理 |
| Get-DbaDbRecoveryModel.ps1 | `public/Get-DbaDbRecoveryModel.ps1` | ソース | 回復モデル取得（関連） |
| Set-DbaDbRecoveryModel.ps1 | `public/Set-DbaDbRecoveryModel.ps1` | ソース | 回復モデル設定（関連） |
