# 機能設計書 59-Set-DbaSpConfigure

## 概要

本ドキュメントは、SQL Serverインスタンスのsp_configure設定値を変更する機能「Set-DbaSpConfigure」の設計仕様を記述する。

### 本機能の処理概要

Set-DbaSpConfigureは、SQL Serverインスタンスのsp_configure設定値を安全に変更する機能である。設定値の範囲検証と動的/静的設定の区別により、不正な設定変更を防止する。

**業務上の目的・背景**：SQL Serverの構成オプション変更は、不適切な値を設定するとサーバーの起動失敗やパフォーマンス問題を引き起こす可能性がある。本機能は、最小値/最大値の範囲チェックと動的設定かどうかの通知により、安全な構成変更を支援する。

**機能の利用シーン**：
- max server memory等の個別設定変更
- 複数インスタンスへの一括設定適用
- Get-DbaSpConfigureからのパイプライン処理

**主要な処理内容**：
1. 対象設定オブジェクトを取得（パラメータまたはパイプライン）
2. 現在値と新しい値が同じ場合はスキップ
3. 新しい値が最小値/最大値の範囲内か検証
4. SMO経由で設定値を更新
5. Configuration.Alter()で変更を適用
6. 動的でない設定の場合は再起動通知

**関連システム・外部連携**：
- Get-DbaSpConfigure: 設定オブジェクト取得
- SMO: Configuration.Alter()

**権限による制御**：
- ALTER SETTINGS権限またはsysadmin権限が必要

## 関連画面

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

## 機能種別

データ更新 / 構成変更

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | No | 対象SQL Serverインスタンス | - |
| SqlCredential | PSCredential | No | SQL Server接続用認証情報 | - |
| Value | int | No | 新しい設定値 | MinValue <= Value <= MaxValue |
| Name | string[] | No | 設定名 | Config, ConfigNameエイリアス |
| InputObject | object[] | No | パイプライン入力用設定オブジェクト | - |
| EnableException | switch | No | 例外をスローする | - |

### 入力データソース

- SqlInstance + Name: 直接指定
- InputObject: Get-DbaSpConfigureからのパイプライン

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverインスタンスのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| ConfigName | string | 設定名 |
| PreviousValue | int | 変更前の値 |
| NewValue | int | 変更後の値 |

### 出力先

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

## 処理フロー

### 処理シーケンス

```
1. InputObject取得
   └─ SqlInstance指定時はGet-DbaSpConfigure実行

2. 各設定オブジェクトに対してループ

3. 同一値チェック
   └─ currentConfigValue == Value の場合はStop-Function（スキップ）

4. 範囲チェック
   └─ Value < MinValue OR Value > MaxValue の場合はStop-Function

5. 設定値更新
   └─ $configobject.Property.ConfigValue = $Value

6. 変更適用
   └─ $server.Configuration.Alter()

7. 結果出力
   └─ PSCustomObject（前後の値）

8. 動的設定判定
   └─ IsDynamic = false の場合は再起動警告
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{SqlInstance指定?}
    B -->|Yes| C[Get-DbaSpConfigure]
    B -->|No| D[InputObject使用]
    C --> E[設定ループ]
    D --> E
    E --> F{現在値 == 新値?}
    F -->|Yes| G[Stop-Function: 同一値]
    G --> E
    F -->|No| H{範囲内?}
    H -->|No| I[Stop-Function: 範囲外]
    I --> E
    H -->|Yes| J[Property.ConfigValue = Value]
    J --> K[Configuration.Alter]
    K --> L{成功?}
    L -->|No| M[Stop-Function: エラー]
    M --> E
    L -->|Yes| N[PSCustomObject出力]
    N --> O{IsDynamic = false?}
    O -->|Yes| P[再起動警告]
    P --> E
    O -->|No| E
    E --> Q{次の設定?}
    Q -->|Yes| E
    Q -->|No| R[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 同一値スキップ | 現在値と同じ値は設定しない | 常時 |
| BR-02 | 範囲検証 | MinValue <= Value <= MaxValue | 常時 |
| BR-03 | 再起動通知 | IsDynamic = false の設定は再起動が必要 | 変更成功時 |

### 計算ロジック

特になし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 設定更新 | sys.configurations | UPDATE | sp_configure実行 |

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

#### sys.configurations

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| UPDATE | value | パラメータValue | Configuration.Alter()経由 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| SameValueError | 同一値エラー | 現在値と新値が同一 | Stop-Functionで処理継続 |
| RangeError | 範囲エラー | 値がMin/Max範囲外 | Stop-Functionで処理継続 |
| AlterError | 変更エラー | Configuration.Alter()失敗 | Stop-Functionで処理継続 |

### リトライ仕様

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

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

Configuration.Alter()は即座にコミットされる。

## パフォーマンス要件

設定数は限定的のため、パフォーマンス上の考慮は不要。

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

- SqlCredentialによる認証情報の安全な受け渡し
- SupportsShouldProcess対応（-WhatIf, -Confirm）
- 範囲検証による不正値の防止

## 備考

- 動的でない設定（IsDynamic = false）はSQL Server再起動後に有効
- ValueはNewValue, NewConfigのエイリアスを持つ

---

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

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

### 推奨読解順序

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

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Set-DbaSpConfigure.ps1 | `public/Set-DbaSpConfigure.ps1` | 132-139行目（PSCustomObject出力） |

**読解のコツ**: シンプルな出力構造で、ConfigName、PreviousValue、NewValueが主要プロパティ。

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

パラメータ定義とInputObject取得を確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Set-DbaSpConfigure.ps1 | `public/Set-DbaSpConfigure.ps1` | 91-102行目（パラメータ定義） |
| 2-2 | Set-DbaSpConfigure.ps1 | `public/Set-DbaSpConfigure.ps1` | 104-106行目（InputObject取得） |

**主要処理フロー**:
1. **93行目**: SqlInstanceパラメータ
2. **95-96行目**: Value（エイリアス: NewValue, NewConfig）
3. **97-98行目**: Name（エイリアス: Config, ConfigName）
4. **104-106行目**: SqlInstance指定時はGet-DbaSpConfigure実行

#### Step 3: バリデーション処理を理解する

同一値チェックと範囲検証を確認する。

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

**主要処理フロー**:
- **117-119行目**: 同一値チェック（currentConfigValue -eq $value）
- **122-124行目**: 範囲チェック（$value -lt $minValue -or $value -gt $maxValue）

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

SMO経由の設定変更と再起動通知を確認する。

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

**主要処理フロー**:
- **129行目**: Property.ConfigValue = $value
- **130行目**: Configuration.Alter()
- **142-143行目**: IsDynamic = false の場合、再起動警告

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

```
Set-DbaSpConfigure
    │
    ├─ [SqlInstance指定時]
    │      └─ Get-DbaSpConfigure (設定オブジェクト取得)
    │
    └─ [process]
           │
           └─ [foreach: InputObject]
                  │
                  ├─ 同一値チェック
                  │      └─ Stop-Function (スキップ)
                  │
                  ├─ 範囲チェック
                  │      └─ Stop-Function (エラー)
                  │
                  ├─ Property.ConfigValue = $Value
                  │
                  ├─ Configuration.Alter()
                  │
                  ├─ PSCustomObject出力
                  │
                  └─ [IsDynamic = false]
                         └─ 再起動警告
```

### データフロー図

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

SqlInstance + Name ──────▶ Get-DbaSpConfigure
         OR                        │
InputObject ─────────────▶        │
                                   ▼
                          同一値チェック
                                   │
                                   ▼
Value ───────────────────▶ 範囲検証
                          (MinValue <= Value <= MaxValue)
                                   │
                                   ▼
                          Property.ConfigValue = Value
                                   │
                                   ▼
                          Configuration.Alter()
                                   │
                                   ▼
                          PSCustomObject ────────────────▶ パイプライン
                          (ConfigName,
                           PreviousValue,
                           NewValue)
                                   │
                          [IsDynamic = false?]
                                   │
                                   ▼
                          再起動警告 ────────────────────▶ コンソール
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Set-DbaSpConfigure.ps1 | `public/Set-DbaSpConfigure.ps1` | ソース | メイン機能実装 |
| Get-DbaSpConfigure.ps1 | `public/Get-DbaSpConfigure.ps1` | ソース | 設定オブジェクト取得 |
| Copy-DbaSpConfigure.ps1 | `public/Copy-DbaSpConfigure.ps1` | ソース | 関連機能（設定コピー） |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続（Get-DbaSpConfigure経由） |
