# 機能設計書 56-Export-DbaSpConfigure

## 概要

本ドキュメントは、SQL Serverインスタンスのsp_configure設定をSQLスクリプトファイルとしてエクスポートする機能「Export-DbaSpConfigure」の設計仕様を記述する。

### 本機能の処理概要

Export-DbaSpConfigureは、SQL Serverインスタンスの全sp_configure設定を含むSQLスクリプトファイルを生成し、他のインスタンスへの設定適用や構成ドキュメント化に使用できる機能である。

**業務上の目的・背景**：SQL Server構成の再現性確保と災害復旧準備には、構成設定のドキュメント化が不可欠である。本機能は、全sp_configure設定を実行可能なSQLスクリプトとして出力することで、設定のバックアップ、バージョン管理、環境複製を可能にする。

**機能の利用シーン**：
- サーバー構成のバックアップ・ドキュメント化
- 災害復旧手順への組み込み
- 構成管理システム（Git等）への設定登録
- Import-DbaSpConfigure用の設定ファイル作成

**主要な処理内容**：
1. 対象インスタンスに接続
2. 'show advanced options'を一時的に有効化（無効の場合）
3. 全Configuration.Propertiesをループ処理
4. EXEC sp_configure文をファイルに出力
5. 'show advanced options'を元の値に復元

**関連システム・外部連携**：
- SMO: Server.Configuration.Properties
- ファイルシステム: SQLスクリプト出力

**権限による制御**：
- sysadmin権限が必要（show advanced optionsの設定変更のため）

## 関連画面

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

## 機能種別

エクスポート / ドキュメント生成

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | Yes | 対象SQL Serverインスタンス | パイプライン入力可能 |
| SqlCredential | PSCredential | No | SQL Server接続用認証情報 | - |
| Path | string | No | 出力ディレクトリ（デフォルト: DbatoolsExport） | - |
| FilePath | string | No | 完全な出力ファイルパス | Pathを上書き |
| EnableException | switch | No | 例外をスローする | - |

### 入力データソース

- SMO: Server.Configuration.Properties

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| Name | string | エクスポートファイル名 |
| FullName | string | 完全ファイルパス |
| Directory | DirectoryInfo | 親ディレクトリオブジェクト |
| Length | long | ファイルサイズ（バイト） |
| CreationTime | datetime | ファイル作成日時 |
| LastWriteTime | datetime | 最終更新日時 |
| Extension | string | ファイル拡張子（.sql） |
| Attributes | FileAttributes | ファイル属性 |

### 出力先

- ファイルシステム: SQLスクリプトファイル
- PowerShellパイプライン: FileInfoオブジェクト

## 処理フロー

### 処理シーケンス

```
1. 出力ディレクトリ確認
   └─ Test-ExportDirectory -Path $Path

2. 各インスタンスに対してループ
   └─ Connect-DbaInstance -MinimumVersion 9 (SQL Server 2005以上)

3. 出力ファイルパス決定
   └─ Get-ExportFilePath でファイル名生成

4. ShowAdvancedOptions確認・設定
   └─ 0の場合は1に設定

5. スクリプトヘッダー出力
   └─ "EXEC sp_configure 'show advanced options', 1; RECONFIGURE WITH OVERRIDE"

6. 各設定をループ出力
   └─ "EXEC sp_configure '$displayname', $configvalue;"

7. ShowAdvancedOptions復元
   └─ 元々0だった場合は0に戻す

8. ファイル情報出力
   └─ Get-ChildItem -Path $FilePath
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[Test-ExportDirectory]
    B --> C[インスタンスループ]
    C --> D[Connect-DbaInstance]
    D --> E{接続成功?}
    E -->|No| F[Stop-Function]
    F --> C
    E -->|Yes| G[Get-ExportFilePath]
    G --> H{ShowAdvancedOptions = 0?}
    H -->|Yes| I[ShowAdvancedOptions = 1設定]
    I --> J[Set-Content ヘッダー]
    H -->|No| J
    J --> K[設定ループ]
    K --> L[Add-Content sp_configure文]
    L --> M{次の設定?}
    M -->|Yes| K
    M -->|No| N{元々ShowAdvancedOptions = 0?}
    N -->|Yes| O[Add-Content 復元コマンド]
    O --> P[ShowAdvancedOptions = 0復元]
    N -->|No| Q[Get-ChildItem出力]
    P --> Q
    Q --> R{次のインスタンス?}
    R -->|Yes| C
    R -->|No| S[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 最小バージョン | SQL Server 2005以上が必要 | 常時 |
| BR-02 | ShowAdvancedOptions復元 | 元の値が0の場合は処理後に0に戻す | 元値が0の場合 |
| BR-03 | ファイル命名規則 | Servername-MMDDYYYYhhmmss-sp_configure.sql | FilePath未指定時 |

### 計算ロジック

特になし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 設定取得 | sys.configurations | SELECT | SMO経由で参照 |
| ShowAdvancedOptions変更 | sys.configurations | UPDATE | 一時的な設定変更 |

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

#### sys.configurations

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | value, name等 | SMO Configuration経由 | 全設定取得 |
| UPDATE | value (show advanced options) | 0 → 1 → 0 | 一時変更 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| ConnectionError | 接続エラー | SQL Serverに接続できない | Stop-Functionで処理継続 |
| AdvancedOptionsError | 設定エラー | ShowAdvancedOptions設定失敗 | Stop-Functionで処理継続 |
| WriteError | 書き込みエラー | ファイル書き込み失敗 | Stop-Functionで処理継続 |

### リトライ仕様

特になし。各インスタンスは独立して処理される。

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

ShowAdvancedOptionsの一時変更と復元は同期的に実行される。

## パフォーマンス要件

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

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

- SqlCredentialによる認証情報の安全な受け渡し
- 出力ファイルにはサーバー構成情報が含まれるため適切なアクセス制御が必要

## 備考

- 出力SQLスクリプトはImport-DbaSpConfigureまたは直接実行で適用可能
- 複数インスタンス指定時はサーバー名と日時がファイル名に含まれる

---

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

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

### 推奨読解順序

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

出力されるSQLスクリプトの構造を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Export-DbaSpConfigure.ps1 | `public/Export-DbaSpConfigure.ps1` | 119行目（ヘッダー）、127行目（設定行） |

**読解のコツ**: Set-Contentで最初の行を書き込み、Add-Contentで追記していく。

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

パラメータ定義とディレクトリ確認を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Export-DbaSpConfigure.ps1 | `public/Export-DbaSpConfigure.ps1` | 84-93行目（パラメータ定義） |
| 2-2 | Export-DbaSpConfigure.ps1 | `public/Export-DbaSpConfigure.ps1` | 94-96行目（begin block） |

**主要処理フロー**:
1. **89行目**: Pathデフォルト値としてDbatoolsExport設定
2. **95行目**: Test-ExportDirectoryで出力先確認

#### Step 3: メイン処理ループを理解する

各インスタンスへの接続と設定出力を確認する。

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

**主要処理フロー**:
- **101行目**: Connect-DbaInstance -MinimumVersion 9
- **106行目**: Get-ExportFilePathでファイルパス決定
- **107行目**: ShowAdvancedOptions確認
- **109-116行目**: ShowAdvancedOptions = 0の場合に1に変更
- **124-127行目**: 設定ループと出力

#### Step 4: ShowAdvancedOptions復元を理解する

処理後の設定復元を確認する。

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

**主要処理フロー**:
- **130行目**: 元値が0の場合の判定
- **131-132行目**: 復元コマンドを追記
- **134-135行目**: サーバー設定を0に戻す

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

```
Export-DbaSpConfigure
    │
    ├─ [begin]
    │      └─ Test-ExportDirectory (出力先確認)
    │
    └─ [process]
           │
           └─ [foreach: SqlInstance]
                  │
                  ├─ Connect-DbaInstance
                  │
                  ├─ Get-ExportFilePath (ファイル名決定)
                  │
                  ├─ ShowAdvancedOptions確認・変更
                  │
                  ├─ Set-Content (ヘッダー出力)
                  │
                  ├─ [foreach: Configuration.Properties]
                  │      └─ Add-Content (sp_configure文)
                  │
                  ├─ ShowAdvancedOptions復元
                  │
                  └─ Get-ChildItem (FileInfo出力)
```

### データフロー図

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

SqlInstance ─────────────▶ Connect-DbaInstance
                                   │
                                   ▼
                          Configuration.Properties
                                   │
Path/FilePath ───────────▶ Get-ExportFilePath
                                   │
                                   ▼
                          Set-Content (ヘッダー)
                                   │
                                   ▼
                          [foreach: Property]
                                   │
                                   ▼
                          Add-Content
                          "EXEC sp_configure
                           '$displayname', $value;"
                                   │
                                   ▼
                          Get-ChildItem ────────────────▶ FileInfo
                          (出力ファイル)              (パイプライン)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Export-DbaSpConfigure.ps1 | `public/Export-DbaSpConfigure.ps1` | ソース | メイン機能実装 |
| Import-DbaSpConfigure.ps1 | `public/Import-DbaSpConfigure.ps1` | ソース | 関連機能（設定インポート） |
| Get-DbaSpConfigure.ps1 | `public/Get-DbaSpConfigure.ps1` | ソース | 関連機能（設定取得） |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続 |
| Test-ExportDirectory.ps1 | `private/functions/Test-ExportDirectory.ps1` | ソース | 出力先確認 |
| Get-ExportFilePath.ps1 | `private/functions/Get-ExportFilePath.ps1` | ソース | ファイルパス生成 |
