# 機能設計書 58-Import-DbaSpConfigure

## 概要

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

### 本機能の処理概要

Import-DbaSpConfigureは、ソースSQL Serverインスタンスから宛先インスタンスへsp_configure設定を直接コピーするか、Export-DbaSpConfigureで生成されたSQLスクリプトファイルから設定を適用する機能である。

**業務上の目的・背景**：サーバー移行やスタンバイ環境構築では、構成設定の正確な複製が必要である。本機能は、インスタンス間での直接コピーとファイルベースのインポートの両方をサポートし、柔軟な構成管理を可能にする。

**機能の利用シーン**：
- サーバー移行時の設定複製
- Export-DbaSpConfigureで保存した設定の適用
- DR環境の構成同期
- 構成テンプレートの展開

**主要な処理内容**：
1. ソースインスタンスから直接コピー（ServerCopyモード）
   - ソース/宛先に接続しshow advanced optionsを有効化
   - 各設定を宛先に適用しRECONFIGURE実行
2. SQLファイルから適用（FromFileモード）
   - SQLスクリプトファイルを読み込み
   - 各行をQuery実行

**関連システム・外部連携**：
- Export-DbaSpConfigure: 一時ファイル生成（ServerCopyモード時）
- ファイルシステム: SQLスクリプト読み込み（FromFileモード時）

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

## 関連画面

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

## 機能種別

データ同期 / 構成インポート

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| Source | DbaInstanceParameter | No | ソースSQL Serverインスタンス（ServerCopyモード） | - |
| Destination | DbaInstanceParameter | No | 宛先SQL Serverインスタンス（ServerCopyモード） | - |
| SourceSqlCredential | PSCredential | No | ソース接続用認証情報 | - |
| DestinationSqlCredential | PSCredential | No | 宛先接続用認証情報 | - |
| SqlInstance | DbaInstanceParameter | No | 対象インスタンス（FromFileモード） | - |
| Path | string | No | SQLスクリプトファイルパス（FromFileモード） | ファイル存在確認 |
| SqlCredential | PSCredential | No | SQL Server接続用認証情報（FromFileモード） | - |
| Force | switch | No | バージョンチェックをスキップ | - |
| EnableException | switch | No | 例外をスローする | - |

### 入力データソース

- ServerCopyモード: Source SQL Serverインスタンス
- FromFileモード: SQLスクリプトファイル

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| - | Boolean | 処理成功/失敗（暗黙的） |

### 出力先

コンソールへのメッセージ出力（Write-Message）

## 処理フロー

### 処理シーケンス

```
1. パラメータセット判定
   └─ Path未指定 && Source指定: ServerCopyモード
   └─ Path指定: FromFileモード

2. [ServerCopyモード]
   a. ソース/宛先に接続
   b. sysadmin権限確認（Test-SqlSa）
   c. バージョン互換性チェック（Force未指定時）
   d. Export-DbaSpConfigureで一時ファイル生成
   e. ShowAdvancedOptions有効化（両サーバー）
   f. 各設定をループで適用
   g. RECONFIGURE実行
   h. ShowAdvancedOptions復元
   i. 一時ファイル削除

3. [FromFileモード]
   a. インスタンスに接続
   b. sysadmin権限確認
   c. ファイル存在確認
   d. ShowAdvancedOptions有効化
   e. ファイル内容をGet-Content
   f. 各行をQuery実行
   g. ShowAdvancedOptions復元
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{Path指定?}
    B -->|No| C[ServerCopyモード]
    B -->|Yes| D[FromFileモード]

    C --> E[ソース/宛先接続]
    E --> F{sysadmin?}
    F -->|No| G[Stop-Function]
    F -->|Yes| H{Force OR 同一バージョン?}
    H -->|No| I[Warning: バージョン不一致]
    I --> J[Return]
    H -->|Yes| K[Export-DbaSpConfigure 一時ファイル]
    K --> L[ShowAdvancedOptions = 1]
    L --> M[設定ループ]
    M --> N[destprop.configvalue = 値]
    N --> O[RECONFIGURE WITH OVERRIDE]
    O --> P{次の設定?}
    P -->|Yes| M
    P -->|No| Q[Configuration.Alter]
    Q --> R[ShowAdvancedOptions復元]
    R --> S[一時ファイル削除]
    S --> T[完了メッセージ]

    D --> U[インスタンス接続]
    U --> V{sysadmin?}
    V -->|No| W[Stop-Function]
    V -->|Yes| X{ファイル存在?}
    X -->|No| Y[Stop-Function]
    X -->|Yes| Z[ShowAdvancedOptions = 1]
    Z --> AA[Get-Content]
    AA --> AB[行ループ]
    AB --> AC[Query実行]
    AC --> AD{次の行?}
    AD -->|Yes| AB
    AD -->|No| AE[ShowAdvancedOptions復元]
    AE --> T
    T --> AF[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | sysadmin要件 | ソース/宛先両方にsysadmin権限が必要 | 常時 |
| BR-02 | バージョン互換性 | メジャーバージョンが一致しない場合は警告 | ServerCopyモード、Force未指定時 |
| BR-03 | 再起動通知 | 一部設定は再起動後に有効 | 設定変更成功時 |

### 計算ロジック

特になし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 設定読み取り | sys.configurations | SELECT | ソースから設定取得 |
| 設定書き込み | sys.configurations | UPDATE | 宛先に設定適用 |

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

#### sys.configurations

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

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| ConnectionError | 接続エラー | SQL Serverに接続できない | Stop-Functionで処理終了 |
| PermissionError | 権限エラー | sysadmin権限なし | Stop-Functionで処理終了 |
| FileNotFoundError | ファイルエラー | SQLファイルが存在しない | Stop-Functionで処理終了 |
| QueryError | クエリエラー | SQL実行失敗 | Stop-Functionで処理継続 |

### リトライ仕様

特になし。各設定/行は独立して処理される。

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

各sp_configure更新は即座にコミット。Configuration.Alter()はまとめて適用を試行。

## パフォーマンス要件

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

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

- SqlCredentialによる認証情報の安全な受け渡し
- sysadmin権限要件の事前確認（Test-SqlSa）
- SQLインジェクションリスク：FromFileモードではファイル内容を直接実行するため、信頼できるファイルのみ使用すること

## 備考

- ServerCopyモードはExport-DbaSpConfigureを内部的に使用
- FromFileモードはExport-DbaSpConfigureで生成されたファイルの使用を想定
- 一部の設定はSQL Server再起動後に有効

---

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

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

### 推奨読解順序

#### Step 1: パラメータセットを理解する

ServerCopyとFromFileの2つのパラメータセットを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Import-DbaSpConfigure.ps1 | `public/Import-DbaSpConfigure.ps1` | 102-120行目（パラメータ定義） |

**読解のコツ**: ParameterSetName="ServerCopy"とParameterSetName="FromFile"で分岐。

#### Step 2: begin blockの初期化を理解する

接続と権限確認を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Import-DbaSpConfigure.ps1 | `public/Import-DbaSpConfigure.ps1` | 121-164行目（begin block） |

**主要処理フロー**:
1. **122-128行目**: Path未指定でSourceありの場合、ソース/宛先接続
2. **130-132行目**: Test-SqlSa でsysadmin確認
3. **147-157行目**: Path指定の場合、ファイル存在確認

#### Step 3: ServerCopyモード処理を理解する

インスタンス間直接コピーを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Import-DbaSpConfigure.ps1 | `public/Import-DbaSpConfigure.ps1` | 168-221行目 |

**主要処理フロー**:
- **169-170行目**: Export-DbaSpConfigure で一時ファイル生成
- **172-176行目**: バージョン互換性チェック
- **179-182行目**: ShowAdvancedOptions有効化
- **186-198行目**: 設定コピーループ
- **200-209行目**: Configuration.Alter()とShowAdvancedOptions復元
- **218-219行目**: 一時ファイル削除

#### Step 4: FromFileモード処理を理解する

ファイルからのインポートを確認する。

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

**主要処理フロー**:
- **224行目**: ShowAdvancedOptions有効化
- **225行目**: Get-Content でファイル読み込み
- **226-232行目**: 各行をQuery実行
- **234行目**: ShowAdvancedOptions復元

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

```
Import-DbaSpConfigure
    │
    ├─ [begin]
    │      ├─ Connect-DbaInstance (ソース/宛先 or 単独)
    │      ├─ Test-SqlSa (sysadmin確認)
    │      └─ Test-Path (ファイル存在確認、FromFile時)
    │
    └─ [process]
           │
           ├─ [ServerCopyモード]
           │      │
           │      ├─ Export-DbaSpConfigure (一時ファイル生成)
           │      │
           │      ├─ ShowAdvancedOptions = 1 (両サーバー)
           │      │
           │      ├─ [foreach: Configuration.Properties]
           │      │      ├─ destprop.configvalue = ソース値
           │      │      └─ Query "RECONFIGURE WITH OVERRIDE"
           │      │
           │      ├─ Configuration.Alter()
           │      │
           │      ├─ ShowAdvancedOptions復元
           │      │
           │      └─ Remove-Item 一時ファイル
           │
           └─ [FromFileモード]
                  │
                  ├─ ShowAdvancedOptions = 1
                  │
                  ├─ Get-Content $Path
                  │
                  ├─ [foreach: $line]
                  │      └─ Query $line
                  │
                  └─ ShowAdvancedOptions復元
```

### データフロー図

```
[ServerCopyモード]

Source ──────────────▶ Connect-DbaInstance
                              │
                              ▼
                       Export-DbaSpConfigure ──────▶ 一時SQLファイル
                              │
                              ▼
Destination ─────────▶ Connect-DbaInstance
                              │
                              ▼
                       Configuration.Properties
                       コピーループ
                              │
                              ▼
                       RECONFIGURE WITH OVERRIDE


[FromFileモード]

SqlInstance ─────────▶ Connect-DbaInstance
                              │
Path (SQLファイル) ──▶ Get-Content
                              │
                              ▼
                       [foreach: $line]
                              │
                              ▼
                       Query実行
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Import-DbaSpConfigure.ps1 | `public/Import-DbaSpConfigure.ps1` | ソース | メイン機能実装 |
| Export-DbaSpConfigure.ps1 | `public/Export-DbaSpConfigure.ps1` | ソース | 一時ファイル生成（ServerCopyモード） |
| Get-DbaSpConfigure.ps1 | `public/Get-DbaSpConfigure.ps1` | ソース | 関連機能（設定取得） |
| Test-SqlSa.ps1 | `private/functions/Test-SqlSa.ps1` | ソース | sysadmin権限確認 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続 |
