# 機能設計書 55-Copy-DbaSpConfigure

## 概要

本ドキュメントは、SQL Serverインスタンス間でsp_configure設定をコピーする機能「Copy-DbaSpConfigure」の設計仕様を記述する。

### 本機能の処理概要

Copy-DbaSpConfigureは、ソースSQL Serverインスタンスからsp_configure設定を取得し、1つ以上の宛先インスタンスに適用することで、インスタンス構成を標準化・同期する機能である。

**業務上の目的・背景**：SQL Serverインスタンスは多数の構成オプション（max server memory、max degree of parallelism、backup compression default等）を持ち、これらを手動で各サーバーに設定するのは時間がかかり、設定ミスのリスクがある。本機能は、テンプレートサーバーの設定を複数のサーバーに一括適用することで、環境の一貫性を確保し、構成管理を効率化する。

**機能の利用シーン**：
- 新規サーバー構築時の本番設定適用
- 開発/テスト環境の本番環境との構成同期
- サーバー移行時の設定複製
- 構成ドリフト検出・修正

**主要な処理内容**：
1. ソースインスタンスに接続しGet-DbaSpConfigureで設定取得
2. 各宛先インスタンスに接続し現在の設定を取得
3. ソースと宛先の設定値を比較
4. 差異がある設定のみSet-DbaSpConfigureで更新
5. 各設定の処理結果を出力

**関連システム・外部連携**：
- Get-DbaSpConfigure: ソース/宛先の設定取得
- Set-DbaSpConfigure: 宛先への設定適用

**権限による制御**：
- ソース/宛先両方にsysadmin権限が必要

## 関連画面

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

## 機能種別

データ同期 / 構成管理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| Source | DbaInstanceParameter | Yes | ソースSQL Serverインスタンス | - |
| SourceSqlCredential | PSCredential | No | ソース接続用認証情報 | - |
| Destination | DbaInstanceParameter[] | Yes | 宛先SQL Serverインスタンス（複数可） | - |
| DestinationSqlCredential | PSCredential | No | 宛先接続用認証情報 | - |
| ConfigName | object[] | No | コピー対象の設定名 | - |
| ExcludeConfigName | object[] | No | 除外する設定名 | - |
| EnableException | switch | No | 例外をスローする | - |

### 入力データソース

- Get-DbaSpConfigure: ソースおよび宛先の設定取得

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| DateTime | DbaDateTime | 操作実行日時 |
| SourceServer | string | ソースSQL Serverインスタンス名 |
| DestinationServer | string | 宛先SQL Serverインスタンス名 |
| Name | string | 設定名 |
| Type | string | 常に"Configuration Value" |
| Status | string | 処理結果（Skipped/Successful/Failed） |
| Notes | string | 補足情報（エラーメッセージ等） |

### 出力先

PowerShellパイプライン（即座に出力）

## 処理フロー

### 処理シーケンス

```
1. ソースインスタンスに接続
   └─ Connect-DbaInstance

2. ソース設定取得
   └─ Get-DbaSpConfigure

3. 各宛先インスタンスに対してループ
   └─ Connect-DbaInstance

4. 宛先設定取得
   └─ Get-DbaSpConfigure

5. 各ソース設定に対してループ
   └─ ConfigName/ExcludeConfigNameフィルタ

6. 宛先に該当設定が存在するか確認
   └─ 存在しない場合はSkipped

7. 設定値比較
   └─ 同一値の場合は出力なし（スキップ）

8. 設定値更新
   └─ Set-DbaSpConfigure

9. 結果出力
   └─ PSCustomObjectとして即座に出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[ソースに接続]
    B --> C{接続成功?}
    C -->|No| D[Stop-Function]
    D --> E[終了]
    C -->|Yes| F[Get-DbaSpConfigure ソース]
    F --> G[宛先ループ開始]
    G --> H[宛先に接続]
    H --> I{接続成功?}
    I -->|No| J[Stop-Function Continue]
    J --> G
    I -->|Yes| K[Get-DbaSpConfigure 宛先]
    K --> L[設定ループ開始]
    L --> M{ConfigName/Excludeフィルタ}
    M -->|除外| L
    M -->|対象| N{宛先に設定存在?}
    N -->|No| O[Skipped出力]
    O --> L
    N -->|Yes| P{値が異なる?}
    P -->|No| L
    P -->|Yes| Q[Set-DbaSpConfigure]
    Q --> R{成功?}
    R -->|Yes| S[Successful出力]
    R -->|No| T[Failed出力]
    S --> L
    T --> L
    L --> U{次の設定?}
    U -->|Yes| L
    U -->|No| V{次の宛先?}
    V -->|Yes| G
    V -->|No| E
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 差分更新のみ | 同一値の設定は更新しない | 常時 |
| BR-02 | 存在確認 | 宛先に存在しない設定はスキップ | 常時 |
| BR-03 | 再起動要求通知 | 動的でない設定は再起動が必要と通知 | IsDynamic = false |

### 計算ロジック

特になし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 設定取得 | sys.configurations | SELECT | SMO経由で参照 |
| 設定更新 | sys.configurations | UPDATE | sp_configure実行 |

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

#### sys.configurations

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | value, value_in_use等 | SMO Configuration経由 | 読み取り |
| UPDATE | value | ソースのConfiguredValue | sp_configure経由 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| ConnectionError | 接続エラー | ソース/宛先に接続できない | Stop-Functionで処理終了/継続 |
| SetError | 設定エラー | Set-DbaSpConfigure失敗 | Failed出力、次の設定へ継続 |

### リトライ仕様

特になし。各設定は独立して処理され、失敗時は次へ継続する。

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

各sp_configure更新はSQL Serverの構成変更として即座にコミットされる。RECONFIGURE WITH OVERRIDEは自動実行される。

## パフォーマンス要件

設定数は限定的（100件程度）のため、パフォーマンス上の考慮は不要。

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

- SqlCredentialによる認証情報の安全な受け渡し
- sysadmin権限要件の明示

## 備考

- 一部の設定はSQL Server再起動後に有効
- ConfigName/ExcludeConfigNameで選択的コピー可能

---

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

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

### 推奨読解順序

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

出力されるPSCustomObjectの構造を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Copy-DbaSpConfigure.ps1 | `public/Copy-DbaSpConfigure.ps1` | 137-145行目（$copySpConfigStatus定義） |

**読解のコツ**: $copySpConfigStatusオブジェクトを各設定処理で更新し、Select-DefaultViewで出力する。

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

begin blockでのソース接続と設定取得を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Copy-DbaSpConfigure.ps1 | `public/Copy-DbaSpConfigure.ps1` | 100-111行目（パラメータ定義） |
| 2-2 | Copy-DbaSpConfigure.ps1 | `public/Copy-DbaSpConfigure.ps1` | 112-119行目（begin block: ソース接続） |

**主要処理フロー**:
1. **114行目**: Connect-DbaInstance ソース接続
2. **115行目**: Get-DbaSpConfigure ソース設定取得

#### Step 3: 宛先処理ループを理解する

各宛先インスタンスへの設定コピーループを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Copy-DbaSpConfigure.ps1 | `public/Copy-DbaSpConfigure.ps1` | 123-130行目（宛先接続） |
| 3-2 | Copy-DbaSpConfigure.ps1 | `public/Copy-DbaSpConfigure.ps1` | 131-193行目（設定ループ） |

**主要処理フロー**:
- **125行目**: Connect-DbaInstance 宛先接続
- **126行目**: Get-DbaSpConfigure 宛先設定取得
- **147-149行目**: ConfigName/ExcludeConfigNameフィルタ
- **151-161行目**: 宛先に設定が存在しない場合Skipped

#### Step 4: 設定更新処理を理解する

Set-DbaSpConfigure呼び出しと結果処理を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Copy-DbaSpConfigure.ps1 | `public/Copy-DbaSpConfigure.ps1` | 165-192行目 |

**主要処理フロー**:
- **165行目**: ConfiguredValue比較
- **168行目**: Set-DbaSpConfigure実行
- **173-176行目**: 再起動要求判定（IsDynamic = false）
- **179-188行目**: エラー処理

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

```
Copy-DbaSpConfigure
    │
    ├─ [begin]
    │      ├─ Connect-DbaInstance (ソース接続)
    │      └─ Get-DbaSpConfigure (ソース設定取得)
    │
    └─ [process]
           │
           └─ [foreach: Destination]
                  │
                  ├─ Connect-DbaInstance (宛先接続)
                  │
                  ├─ Get-DbaSpConfigure (宛先設定取得)
                  │
                  └─ [foreach: ソース設定]
                         │
                         ├─ 宛先存在確認
                         │
                         ├─ 値比較
                         │
                         └─ Set-DbaSpConfigure (差分更新)
                                └─ PSCustomObject出力
```

### データフロー図

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

Source ───────────────▶ Connect-DbaInstance
                              │
                              ▼
                       Get-DbaSpConfigure ──────▶ sourceProps
                              │
Destination ──────────▶ Connect-DbaInstance
                              │
                              ▼
                       Get-DbaSpConfigure ──────▶ destProps
                              │
ConfigName/            ソース設定ループ
ExcludeConfigName ────▶ フィルタ
                              │
                              ▼
                       値比較
                              │
                       ┌──────┴──────┐
                       ▼             ▼
                    同一値       差分あり
                       │             │
                       ▼             ▼
                    スキップ    Set-DbaSpConfigure
                                     │
                                     ▼
                              PSCustomObject ────────▶ パイプライン
                              (Status, Notes等)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Copy-DbaSpConfigure.ps1 | `public/Copy-DbaSpConfigure.ps1` | ソース | メイン機能実装 |
| Get-DbaSpConfigure.ps1 | `public/Get-DbaSpConfigure.ps1` | ソース | 設定取得 |
| Set-DbaSpConfigure.ps1 | `public/Set-DbaSpConfigure.ps1` | ソース | 設定更新 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続 |
