# 機能設計書 221-Set-DbaDbRecoveryModel

## 概要

本ドキュメントは、SQL Serverデータベースの復旧モデル（Recovery Model）を変更するdbatools PowerShellコマンドレット「Set-DbaDbRecoveryModel」の機能設計書である。

### 本機能の処理概要

Set-DbaDbRecoveryModelは、SQL Serverインスタンス上の指定されたデータベースの復旧モデル設定を変更するコマンドレットである。Simple（単純）、Full（完全）、BulkLogged（一括ログ）の3種類の復旧モデル間で切り替えを行い、データベースのバックアップ戦略やトランザクションログの動作を制御する。

**業務上の目的・背景**：データベースの復旧モデルは、バックアップ戦略とデータ保護レベルを決定する重要な設定である。本番環境ではポイントインタイム復旧が可能なFull復旧モデルが推奨されるが、開発環境ではトランザクションログの肥大化を防ぐためSimple復旧モデルが適切な場合がある。また、大量データのインポート時にはBulkLogged復旧モデルでログ書き込みを最小化できる。これらの切り替えを効率的に行うためにこの機能が必要である。

**機能の利用シーン**：
- 本番環境のデータベースをポイントインタイム復旧可能な状態に構成する場合
- 開発・テスト環境でトランザクションログの肥大化を防止する場合
- 大量データの一括インポート前にBulkLoggedモードに切り替える場合
- データベースのバックアップ戦略を変更する際の設定変更

**主要な処理内容**：
1. 指定されたSQL Serverインスタンスへの接続確立
2. 対象データベースの特定と検証（tempdbとスナップショットは自動除外）
3. 現在の復旧モデルと指定された復旧モデルの比較
4. ALTER DATABASE文による復旧モデルの変更実行
5. 変更後のデータベース情報の出力

**関連システム・外部連携**：SQL Server Management Objects (SMO) を介してSQL Serverと連携する。

**権限による制御**：データベースの復旧モデルを変更するには、対象データベースに対するALTER DATABASE権限またはデータベース所有者権限が必要である。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | コマンドライン | 主画面 | PowerShellコンソールからの直接実行 |

## 機能種別

データベース設定変更（UPDATE操作）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstance[] | Yes（Instanceパラメータセット） | 対象SQL Serverインスタンス | 有効なインスタンス名 |
| SqlCredential | PSCredential | No | 認証用資格情報 | - |
| RecoveryModel | string | Yes | 設定する復旧モデル | 'Simple', 'Full', 'BulkLogged'のいずれか |
| Database | object[] | No | 対象データベース名 | - |
| ExcludeDatabase | object[] | No | 除外データベース名 | - |
| AllDatabases | switch | No | 全データベース対象フラグ | -Database未指定時は必須 |
| EnableException | switch | No | 例外有効化フラグ | - |
| InputObject | Microsoft.SqlServer.Management.Smo.Database[] | Yes（Pipelineパラメータセット） | パイプライン入力用データベースオブジェクト | - |

### 入力データソース

- PowerShellコマンドライン入力
- Get-DbaDatabase等からのパイプライン入力

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverインスタンスのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| Name | string | データベース名 |
| Status | string | データベースの状態 |
| IsAccessible | bool | データベースがアクセス可能か |
| RecoveryModel | string | 新しい復旧モデル |
| LastFullBackup | DateTime | 最終フルバックアップ日時 |
| LastDiffBackup | DateTime | 最終差分バックアップ日時 |
| LastLogBackup | DateTime | 最終ログバックアップ日時 |

### 出力先

PowerShellパイプライン（標準出力）

## 処理フロー

### 処理シーケンス

```
1. パラメータ検証
   └─ RecoveryModelの値が有効か確認

2. SQL Serverインスタンスへの接続
   └─ Connect-DbaInstanceを使用して接続

3. データベース対象の特定
   └─ -Database/-AllDatabases/-ExcludeDatabase条件に基づきフィルタリング
   └─ tempdb、スナップショット、アクセス不可データベースを除外

4. 各データベースに対する処理ループ
   └─ 現在の復旧モデルと指定値を比較
   └─ 異なる場合のみALTER処理を実行

5. 復旧モデル変更の実行
   └─ SMO経由でRecoveryModelプロパティを設定
   └─ Alter()メソッドで変更を適用

6. 結果の出力
   └─ Get-DbaDbRecoveryModelを呼び出して更新後の状態を返却
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[パラメータ検証]
    B --> C[SQL Serverへ接続]
    C --> D{接続成功?}
    D -->|No| E[エラー出力・継続]
    D -->|Yes| F[データベース一覧取得]
    F --> G[フィルタリング適用]
    G --> H{対象DB存在?}
    H -->|No| I[エラー出力・終了]
    H -->|Yes| J[各DBに対してループ]
    J --> K{現在の復旧モデル<br/>= 指定値?}
    K -->|Yes| L[警告出力・次へ]
    K -->|No| M{ShouldProcess確認}
    M -->|No| N[スキップ]
    M -->|Yes| O[復旧モデル変更]
    O --> P[Alter実行]
    P --> Q[結果取得・出力]
    Q --> R{次のDB?}
    L --> R
    N --> R
    R -->|Yes| J
    R -->|No| S[終了]
    E --> S
    I --> S
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | tempdb除外 | tempdbは復旧モデル変更対象から自動除外 | 常時 |
| BR-002 | スナップショット除外 | データベーススナップショットは対象外 | IsDatabaseSnapshot = true |
| BR-003 | アクセス可能性チェック | アクセス不可データベースは対象外 | IsAccessible = false |
| BR-004 | 同一値スキップ | 現在値と同じ場合はエラー出力 | RecoveryModel = 指定値 |
| BR-005 | 明示的指定要求 | -Databaseまたは-AllDatabasesの指定必須 | パラメータ検証時 |

### 計算ロジック

該当なし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 復旧モデル変更 | sys.databases | UPDATE（間接） | ALTER DATABASE文による設定変更 |

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

#### sys.databases

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| UPDATE | recovery_model | 1 (Full), 2 (BulkLogged), 3 (Simple) | SMO経由で自動的に実行される |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ConnectionError | SQL Server接続失敗 | 接続情報を確認して再実行 |
| - | InvalidArgument | -Database/-AllDatabases未指定 | いずれかのパラメータを指定 |
| - | NotFound | 指定データベースが存在しない | データベース名を確認 |
| - | AlreadySet | 既に指定の復旧モデル | 変更不要または別の値を指定 |

### リトライ仕様

リトライ処理は実装されていない。エラー発生時はStop-Functionで処理を停止し、-Continueにより次の対象に進む。

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

ALTER DATABASE文は暗黙的なトランザクションで実行される。SMOのAlter()メソッドが個別にコミットを行う。

## パフォーマンス要件

特に定義されていない。ALTER DATABASE文は即座に完了する軽量な操作である。

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

- ALTER DATABASE権限またはdb_owner権限が必要
- Windows認証またはSQL Server認証をサポート
- Azure AD認証もConnect-DbaInstanceを介してサポート

## 備考

- Full復旧モデルに変更後は、トランザクションログのバックアップが必要になる
- Simple復旧モデルではポイントインタイム復旧ができなくなる
- WhatIfとConfirmパラメータをサポート

---

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

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

### 推奨読解順序

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

SMOのDatabaseオブジェクトの構造とRecoveryModel列挙型を理解することが重要である。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Set-DbaDbRecoveryModel.ps1 | `public/Set-DbaDbRecoveryModel.ps1` | 出力オブジェクトの構造（66-85行目の.OUTPUTSセクション） |

**読解のコツ**: PowerShellのパラメータセット（ParameterSetName）に注目。"Instance"と"Pipeline"の2つのパラメータセットがある。

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

メイン処理はprocess {}ブロック内にある。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Set-DbaDbRecoveryModel.ps1 | `public/Set-DbaDbRecoveryModel.ps1` | process {}ブロック（127-173行目） |

**主要処理フロー**:
1. **128-133行目**: 各SqlInstanceに対するループとConnect-DbaInstanceによる接続
2. **135-138行目**: -Database/-AllDatabases必須チェック
3. **141-151行目**: データベースのフィルタリング（tempdb除外、アクセス可能性チェック）
4. **161-172行目**: 各データベースに対する復旧モデル変更処理

#### Step 3: 復旧モデル変更ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Set-DbaDbRecoveryModel.ps1 | `public/Set-DbaDbRecoveryModel.ps1` | 復旧モデル変更の実装（162-171行目） |

**主要処理フロー**:
- **162行目**: 現在の復旧モデルと指定値の比較
- **165-167行目**: ShouldProcess確認後、SMO経由で復旧モデルを設定
- **171行目**: Get-DbaDbRecoveryModelで結果を取得して出力

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

```
Set-DbaDbRecoveryModel
    │
    ├─ Connect-DbaInstance (接続確立)
    │      └─ SQL Server SMO接続
    │
    ├─ Get-DbaDatabase (暗黙的に$server.Databases経由)
    │      └─ データベース一覧取得
    │
    ├─ $db.Alter() (SMOメソッド)
    │      └─ ALTER DATABASE実行
    │
    └─ Get-DbaDbRecoveryModel (結果取得)
           └─ 更新後の状態を出力
```

### データフロー図

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

SqlInstance ─────────┐
SqlCredential ───────┤
RecoveryModel ───────┼──▶ Connect-DbaInstance ──▶ SMO Server
Database/AllDatabases┘         │
                               ▼
                        データベースフィルタリング
                               │
                               ▼
                        復旧モデル比較・変更
                        ($db.RecoveryModel = $RecoveryModel)
                        ($db.Alter())
                               │
                               ▼
                        Get-DbaDbRecoveryModel ──▶ Database Object
                                                   (RecoveryModel設定済み)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Set-DbaDbRecoveryModel.ps1 | `public/Set-DbaDbRecoveryModel.ps1` | ソース | メインコマンドレット実装 |
| Get-DbaDbRecoveryModel.ps1 | `public/Get-DbaDbRecoveryModel.ps1` | ソース | 復旧モデル取得（出力用に呼び出し） |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続処理 |
