# 機能設計書 108-Get-DbaDbRecoveryModel

## 概要

本ドキュメントは、SQL Serverデータベースのリカバリモデル設定とバックアップ履歴情報を取得するGet-DbaDbRecoveryModel機能の設計仕様を定義する。

### 本機能の処理概要

本機能は、データベースのリカバリモデル設定（Simple、Full、BulkLogged）と最終バックアップ日時を取得する。バックアップ戦略の計画とコンプライアンス監査に不可欠な情報を提供する。

**業務上の目的・背景**：リカバリモデルはデータベースのバックアップ・復旧戦略を決定する重要な設定である。不適切なリカバリモデルの設定は、データ損失リスクの増大やトランザクションログの肥大化につながる。本機能により、ビジネス要件に適合したリカバリモデルが設定されているかを監査し、バックアップポリシーとの整合性を確認できる。

**機能の利用シーン**：
- バックアップ戦略の計画と検証
- リカバリモデル設定のコンプライアンス監査
- トランザクションログ肥大化のトラブルシューティング
- 災害復旧計画の文書化
- 最終バックアップ日時の確認

**主要な処理内容**：
1. Get-DbaDatabaseを使用したデータベース情報取得
2. RecoveryModelパラメータによるフィルタリング
3. Select-DefaultViewによる出力形式の制御

**関連システム・外部連携**：内部的にGet-DbaDatabaseコマンドを使用してSMOオブジェクトを取得。

**権限による制御**：対象データベースへのVIEW DATABASE STATE権限が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 28 | リカバリモデル | 主画面 | リカバリモデルの取得 |

## 機能種別

データ取得処理（構成情報取得）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstance[] | Yes | 対象のSQL Serverインスタンス | パイプライン入力対応、Mandatory |
| SqlCredential | PSCredential | No | 代替認証情報 | Windows/SQL認証、AD統合認証 |
| RecoveryModel | string[] | No | フィルタするリカバリモデル | ValidateSet: Simple, Full, BulkLogged |
| Database | object[] | No | 対象データベース名 | 存在するデータベース名 |
| ExcludeDatabase | object[] | No | 除外するデータベース名 | 存在するデータベース名 |
| EnableException | switch | No | 例外処理モードの切り替え | - |

### 入力データソース

- SqlInstance: コマンドラインパラメータまたはパイプライン入力

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverをホストするコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| Name | string | データベース名 |
| Status | string | データベースの状態（EmergencyMode、Normal、Offline、Recovering等） |
| IsAccessible | bool | データベースがアクセス可能かどうか |
| RecoveryModel | string | リカバリモデル（Full、Simple、BulkLogged） |
| LastFullBackup | DateTime | 最終フルバックアップ日時 |
| LastDiffBackup | DateTime | 最終差分バックアップ日時 |
| LastLogBackup | DateTime | 最終ログバックアップ日時 |

### 出力先

PowerShellパイプライン（Microsoft.SqlServer.Management.Smo.Database）

## 処理フロー

### 処理シーケンス

```
1. デフォルト出力プロパティの定義（beginブロック）
   └─ ComputerName, InstanceName, SqlInstance, Name, Status, IsAccessible, RecoveryModel, LastBackupDate等
2. Get-DbaDatabaseの呼び出し
   └─ スプラットでパラメータを渡す
3. RecoveryModelパラメータによるフィルタリング
   └─ RecoveryModel指定時: Where-Objectでフィルタ + IsAccessibleチェック
   └─ 未指定時: 全DBを出力
4. Select-DefaultViewで出力形式を制御
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[デフォルトプロパティ定義]
    B --> C[スプラット構築]
    C --> D[Get-DbaDatabase呼び出し]
    D --> E{RecoveryModel指定?}
    E -->|Yes| F[Where-Object RecoveryModel in $RecoveryModel]
    F --> G[Where-Object IsAccessible]
    G --> H[Select-DefaultView]
    E -->|No| I[Select-DefaultView]
    H --> J[結果出力]
    I --> J
    J --> K[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-801 | リカバリモデルフィルタ | RecoveryModel指定時はIsAccessibleなDBのみフィルタ | RecoveryModel指定時 |
| BR-802 | ValidateSet | RecoveryModelは'Simple', 'Full', 'BulkLogged'のみ許可 | パラメータ検証時 |

### 計算ロジック

特に計算ロジックはなく、Get-DbaDatabaseの出力をフィルタリングして返す。

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

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

| 操作 | 対象テーブル/ビュー | 操作種別 | 概要 |
|-----|-------------|---------|------|
| DB情報取得 | SMO Database | メタデータ読取 | Get-DbaDatabase経由 |

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

内部的にGet-DbaDatabaseがSMOを使用してsys.databases等のカタログビューにアクセス。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | Get-DbaDatabaseで処理 | 接続エラー等 | Get-DbaDatabaseのエラーハンドリングに委譲 |

### リトライ仕様

Get-DbaDatabaseに委譲。

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

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

## パフォーマンス要件

Get-DbaDatabaseのパフォーマンスに依存。SMOメタデータアクセスのため高速。

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

- VIEW DATABASE STATE権限が必要
- SqlCredentialパラメータで代替認証情報をサポート

## 備考

- 関連コマンド：Set-DbaDbRecoveryModel（リカバリモデルの変更）、Test-DbaDbRecoveryModel（テスト）
- リカバリモデルの詳細: https://docs.microsoft.com/en-us/sql/relational-databases/backup-restore/recovery-models-sql-server

---

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

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

### 推奨読解順序

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

デフォルト出力プロパティの定義を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaDbRecoveryModel.ps1 | `public/Get-DbaDbRecoveryModel.ps1` | 91-93行目：デフォルトプロパティ定義 |

**読解のコツ**: beginブロックで$defaults配列を定義し、Select-DefaultViewに渡している。'LastBackupDate as LastFullBackup'のようなエイリアス指定で出力列名を変更。

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

パラメータ定義とスプラットの使用を確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaDbRecoveryModel.ps1 | `public/Get-DbaDbRecoveryModel.ps1` | 79-89行目：パラメータ定義 |
| 2-2 | Get-DbaDbRecoveryModel.ps1 | `public/Get-DbaDbRecoveryModel.ps1` | 84-85行目：ValidateSet制約 |

**主要処理フロー**:
1. **91-93行目**: デフォルトプロパティ定義（beginブロック）
2. **96-102行目**: スプラットでGet-DbaDatabaseパラメータを構築
3. **104-107行目**: RecoveryModel指定時のフィルタリング

#### Step 3: フィルタリングロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaDbRecoveryModel.ps1 | `public/Get-DbaDbRecoveryModel.ps1` | 104-108行目：条件分岐とフィルタリング |

**主要処理フロー**:
- **104行目**: `if ($RecoveryModel)`でRecoveryModel指定有無を判定
- **105行目**: Get-DbaDatabase結果を`Where-Object RecoveryModel -in $RecoveryModel`でフィルタ
- **105行目**: さらに`Where-Object IsAccessible`でアクセス可能なDBのみ
- **107行目**: RecoveryModel未指定時は全DB出力

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

```
Get-DbaDbRecoveryModel
    │
    └─ Get-DbaDatabase（スプラット使用）
           │
           ├─ Connect-DbaInstance
           │
           └─ SMO Database取得
```

### データフロー図

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

SqlInstance ──┐
              │
Database ─────┼──▶ Get-DbaDatabase ───┐
              │          │             │
ExcludeDatabase─┘        ▼             │
                  ┌─────────────┐      │
RecoveryModel ───▶│ フィルタ    │◀─────┘
                  │ (Where-Object)│
                  └──────┬──────┘
                         │
                         ▼
                  ┌─────────────┐
                  │ Select-     │
                  │ DefaultView │
                  └──────┬──────┘
                         │
                         ▼
                  ┌─────────────┐      ┌─ ComputerName
                  │ SMO Database│──────┼─ Name
                  │ (フィルタ済)│      ├─ Status
                  └─────────────┘      ├─ IsAccessible
                                       ├─ RecoveryModel
                                       ├─ LastFullBackup
                                       ├─ LastDiffBackup
                                       └─ LastLogBackup
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaDbRecoveryModel.ps1 | `public/Get-DbaDbRecoveryModel.ps1` | ソース | メイン処理 |
| Get-DbaDatabase.ps1 | `public/Get-DbaDatabase.ps1` | ソース | データベースオブジェクト取得 |
| Select-DefaultView.ps1 | `internal/functions/Select-DefaultView.ps1` | ソース | 出力形式制御 |
