# 機能設計書 57-Get-DbaSpConfigure

## 概要

本ドキュメントは、SQL Serverインスタンスのsp_configure設定を取得し、デフォルト値との比較情報を提供する機能「Get-DbaSpConfigure」の設計仕様を記述する。

### 本機能の処理概要

Get-DbaSpConfigureは、SQL Serverインスタンスの全sp_configure設定をSMO経由で取得し、現在の設定値、実行中の値、デフォルト値との比較情報を含む詳細なオブジェクトを出力する機能である。

**業務上の目的・背景**：SQL Serverの構成監査、コンプライアンスチェック、環境間の設定比較には、現在の設定値だけでなく、デフォルト値からの変更有無や、設定変更に再起動が必要かどうかの情報が重要である。本機能は、これらの情報を構造化されたオブジェクトとして提供し、構成管理を支援する。

**機能の利用シーン**：
- サーバー構成の棚卸し・監査
- デフォルト値から変更された設定の特定
- 複数サーバー間の設定比較
- Set-DbaSpConfigureへのパイプライン入力

**主要な処理内容**：
1. 対象インスタンスに接続
2. SMO Server.Configuration.Propertiesから全設定を取得
3. 各設定に対してデフォルト値データを照合
4. 設定情報とデフォルト比較結果を含むオブジェクトを出力

**関連システム・外部連携**：
- SMO: Server.Configuration.Properties
- Get-SqlDefaultSpConfigure: デフォルト値参照関数

**権限による制御**：
- sys.configurationsへの読み取り権限が必要

## 関連画面

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

## 機能種別

データ取得 / 監査

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | Yes | 対象SQL Serverインスタンス | パイプライン入力可能 |
| SqlCredential | PSCredential | No | SQL Server接続用認証情報 | - |
| Name | string[] | No | 取得対象の設定名（DisplayNameまたはSMO名） | - |
| ExcludeName | string[] | No | 除外する設定名 | - |
| EnableException | switch | No | 例外をスローする | - |

### 入力データソース

- SMO: Server.Configuration.Properties
- Get-SqlDefaultSpConfigure: バージョン別デフォルト値

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverインスタンスのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| Name | string | SMOプロパティ名 |
| DisplayName | string | sp_configureの表示名 |
| Description | string | 設定の説明 |
| IsAdvanced | bool | 高度な設定フラグ |
| IsDynamic | bool | 動的設定フラグ（再起動不要） |
| MinValue | int | 最小許容値 |
| MaxValue | int | 最大許容値 |
| ConfiguredValue | int | 設定済み値 |
| RunningValue | int | 実行中の値 |
| DefaultValue | int | SQLバージョンのデフォルト値 |
| IsRunningDefaultValue | bool | 実行値がデフォルトと一致するか |

### 出力先

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

## 処理フロー

### 処理シーケンス

```
1. 設定名マッピング初期化
   └─ begin block: $smoName ハッシュテーブル作成

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

3. Configuration.Properties取得
   └─ $server.Configuration.Properties

4. Name/ExcludeNameフィルタ
   └─ DisplayNameまたはSMO名でフィルタ

5. デフォルト値取得
   └─ Get-SqlDefaultSpConfigure -SqlVersion $server.VersionMajor

6. 各設定に対してループ
   └─ デフォルト比較、オブジェクト出力

7. 結果出力
   └─ Select-DefaultViewで整形して出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[smoNameマッピング初期化]
    B --> C[インスタンスループ]
    C --> D[Connect-DbaInstance]
    D --> E{接続成功?}
    E -->|No| F[Stop-Function]
    F --> C
    E -->|Yes| G[Configuration.Properties取得]
    G --> H[Name/ExcludeNameフィルタ]
    H --> I[Get-SqlDefaultSpConfigure]
    I --> J[設定ループ]
    J --> K[デフォルト値検索]
    K --> L[IsRunningDefaultValue判定]
    L --> M[PSCustomObject出力]
    M --> N{次の設定?}
    N -->|Yes| J
    N -->|No| O{次のインスタンス?}
    O -->|Yes| C
    O -->|No| P[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 名前マッチング | DisplayNameとSMO名の両方でフィルタ可能 | Name/ExcludeName指定時 |
| BR-02 | デフォルト比較 | RunningValueとDefaultValueを比較 | 常時 |
| BR-03 | 空値除外 | RunValueが空の設定は出力しない | 常時 |

### 計算ロジック

- IsRunningDefaultValue: DefaultValue == RunningValue なら $true

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

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

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

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

#### sys.configurations

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | value, value_in_use, minimum, maximum等 | SMO Configuration経由 | 読み取り専用 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| ConnectionError | 接続エラー | SQL Serverに接続できない | Stop-Functionで処理継続 |
| PropertiesError | プロパティ取得エラー | Configuration.Properties取得失敗 | Stop-Functionで処理継続 |

### リトライ仕様

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

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

読み取り専用操作のためトランザクション制御なし。

## パフォーマンス要件

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

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

- SqlCredentialによる認証情報の安全な受け渡し
- 読み取り専用操作（書き込みなし）

## 備考

- 設定名はDisplayName（'max server memory (MB)'）とSMO名（MaxServerMemory）の両方で指定可能
- IsAdvancedがtrueの設定は'show advanced options'が有効な場合のみ完全な情報が取得可能

---

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

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

### 推奨読解順序

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

設定名マッピングと出力オブジェクト構造を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaSpConfigure.ps1 | `public/Get-DbaSpConfigure.ps1` | 115-217行目（$smoNameハッシュテーブル） |
| 1-2 | Get-DbaSpConfigure.ps1 | `public/Get-DbaSpConfigure.ps1` | 256-275行目（PSCustomObject出力） |

**読解のコツ**: $smoNameハッシュテーブルはDisplayName→SMO名のマッピング。これにより両方の名前でフィルタ可能。

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

パラメータ定義とbegin blockを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaSpConfigure.ps1 | `public/Get-DbaSpConfigure.ps1` | 104-113行目（パラメータ定義） |
| 2-2 | Get-DbaSpConfigure.ps1 | `public/Get-DbaSpConfigure.ps1` | 114-218行目（begin block: smoName初期化） |

**主要処理フロー**:
1. **106行目**: SqlInstance必須パラメータ
2. **109-110行目**: Name/ExcludeNameパラメータ（Alias: Config, ConfigName）

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

設定取得とフィルタリングを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaSpConfigure.ps1 | `public/Get-DbaSpConfigure.ps1` | 219-232行目（接続とプロパティ取得） |
| 3-2 | Get-DbaSpConfigure.ps1 | `public/Get-DbaSpConfigure.ps1` | 234-240行目（フィルタリング） |

**主要処理フロー**:
- **229行目**: Configuration.Properties取得
- **235行目**: Nameフィルタ（DisplayNameまたはSMO名）
- **238-239行目**: ExcludeNameフィルタ

#### Step 4: デフォルト値比較を理解する

Get-SqlDefaultSpConfigureの呼び出しと比較ロジックを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Get-DbaSpConfigure.ps1 | `public/Get-DbaSpConfigure.ps1` | 243行目（デフォルト値取得） |
| 4-2 | Get-DbaSpConfigure.ps1 | `public/Get-DbaSpConfigure.ps1` | 246-251行目（デフォルト比較） |

**主要処理フロー**:
- **243行目**: Get-SqlDefaultSpConfigure -SqlVersion でバージョン別デフォルト取得
- **247行目**: DisplayNameでデフォルト値を検索
- **249-250行目**: DefaultValueとRunValueを比較してIsRunningDefaultValue判定

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

```
Get-DbaSpConfigure
    │
    ├─ [begin]
    │      └─ $smoName ハッシュテーブル初期化
    │
    └─ [process]
           │
           └─ [foreach: SqlInstance]
                  │
                  ├─ Connect-DbaInstance
                  │
                  ├─ Server.Configuration.Properties取得
                  │
                  ├─ Name/ExcludeNameフィルタ
                  │
                  ├─ Get-SqlDefaultSpConfigure (デフォルト値取得)
                  │
                  └─ [foreach: Property]
                         │
                         ├─ デフォルト値検索
                         │
                         ├─ IsRunningDefaultValue判定
                         │
                         └─ PSCustomObject出力
                                └─ Select-DefaultView
```

### データフロー図

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

SqlInstance ─────────────▶ Connect-DbaInstance
                                   │
                                   ▼
                          Configuration.Properties
                                   │
Name/ExcludeName ────────▶ フィルタリング
                                   │
                                   ▼
                          Get-SqlDefaultSpConfigure
                          (バージョン別デフォルト)
                                   │
                                   ▼
                          [foreach: Property]
                                   │
                                   ▼
                          デフォルト比較
                          IsRunningDefaultValue判定
                                   │
                                   ▼
                          PSCustomObject ────────────────▶ パイプライン
                          (Name, DisplayName,
                           ConfiguredValue,
                           RunningValue,
                           DefaultValue,
                           IsRunningDefaultValue 等)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaSpConfigure.ps1 | `public/Get-DbaSpConfigure.ps1` | ソース | メイン機能実装 |
| Set-DbaSpConfigure.ps1 | `public/Set-DbaSpConfigure.ps1` | ソース | 関連機能（設定変更） |
| Copy-DbaSpConfigure.ps1 | `public/Copy-DbaSpConfigure.ps1` | ソース | 関連機能（設定コピー） |
| Get-SqlDefaultSpConfigure.ps1 | `private/functions/Get-SqlDefaultSpConfigure.ps1` | ソース | デフォルト値取得 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続 |
