# 画面設計書 102-起動パラメータ

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおけるSQL Serverの起動パラメータ管理機能（Get-DbaStartupParameter、Set-DbaStartupParameter）の設計仕様を記載する。

### 本画面の処理概要

SQL Serverの起動パラメータ（masterデータベースパス、エラーログパス、トレースフラグ、シングルユーザーモード等）をWindowsレジストリ/WMI経由で取得・設定するためのコマンドラインインターフェースを提供する。

**業務上の目的・背景**：SQL Serverの起動パラメータはSQL Server Configuration Managerで管理するが、複数インスタンスの一括管理や自動化には不向きである。本機能によりPowerShellから起動パラメータを取得・変更でき、トラブルシューティング時のシングルユーザーモード設定、トレースフラグの有効化、システムデータベースファイルの移動などを効率的に実行できる。SQL Serverに接続せずにWMI経由で設定を確認できるため、起動不能時の診断にも有効。

**画面へのアクセス方法**：PowerShellコンソールから `Get-DbaStartupParameter` または `Set-DbaStartupParameter` コマンドを実行する。管理者権限での実行が必要。

**主要な操作・処理内容**：
1. 起動パラメータの取得（Get-DbaStartupParameter）：masterデータベースパス、ログパス、エラーログパス、トレースフラグ、各種起動モードフラグを取得
2. 起動パラメータの設定（Set-DbaStartupParameter）：上記パラメータを変更（サービス再起動まで反映されない）
3. 簡易モード出力（-Simple）：必須情報のみを取得する軽量出力
4. 構成のバックアップ/リストア：StartupConfigオブジェクトによる設定の保存と復元

**画面遷移**：本コマンドは独立して実行可能。Get-DbaStartupParameterの結果をStartupConfigパラメータとしてSet-DbaStartupParameterに渡すことで、設定のバックアップと復元が可能。

**権限による表示制御**：Windowsの管理者権限およびWMIへのリモートアクセス権限が必要。SQL Server認証は使用しない。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 147 | Get-DbaStartupParameter | 主機能 | 起動パラメータの取得 |
| 230 | Set-DbaStartupParameter | 主機能 | 起動パラメータの設定 |

## 画面種別

コマンドラインインターフェース（取得・設定）

## URL/ルーティング

PowerShellコマンド実行

## 入出力項目

### Get-DbaStartupParameter パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | 必須 | 対象SQL Serverインスタンス |
| Credential | PSCredential | 任意 | Windows認証情報（WMIアクセス用） |
| Simple | Switch | 任意 | 簡易出力モード |
| EnableException | Switch | 任意 | 例外を有効にする |

### Set-DbaStartupParameter パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | 必須 | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | 任意 | SQL Server認証情報（パス検証用） |
| Credential | PSCredential | 任意 | Windows認証情報（WMIアクセス用） |
| MasterData | string | 任意 | masterデータベースデータファイルパス |
| MasterLog | string | 任意 | masterデータベースログファイルパス |
| ErrorLog | string | 任意 | エラーログファイルパス |
| TraceFlag | string[] | 任意 | 有効にするトレースフラグ |
| CommandPromptStart | Switch | 任意 | コマンドプロンプト起動モード(-c) |
| MinimalStart | Switch | 任意 | 最小構成起動モード(-f) |
| MemoryToReserve | int | 任意 | 予約メモリ(MB)(-g) |
| SingleUser | Switch | 任意 | シングルユーザーモード(-m) |
| SingleUserDetails | string | 任意 | シングルユーザー許可アカウント |
| NoLoggingToWinEvents | Switch | 任意 | Windowsイベントログ無効(-n) |
| StartAsNamedInstance | Switch | 任意 | 名前付きインスタンス起動(-s) |
| DisableMonitoring | Switch | 任意 | 監視無効化(-x) |
| IncreasedExtents | Switch | 任意 | エクステント増加(-E) |
| TraceFlagOverride | Switch | 任意 | トレースフラグ上書きモード |
| StartupConfig | object | 任意 | 以前の設定を復元 |
| Offline | Switch | 任意 | オフラインモード |
| Force | Switch | 任意 | パス検証をスキップ |

## 表示項目

### Get-DbaStartupParameter 出力プロパティ（通常モード）

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全なインスタンス名 |
| MasterData | string | masterデータベースデータファイルパス |
| MasterLog | string | masterデータベースログファイルパス |
| ErrorLog | string | エラーログファイルパス |
| TraceFlags | int[]/string | トレースフラグ配列または"None" |
| DebugFlags | int[]/string | デバッグフラグ配列または"None" |
| CommandPromptStart | bool | コマンドプロンプト起動モード有効 |
| MinimalStart | bool | 最小構成起動モード有効 |
| MemoryToReserve | int | 予約メモリ(MB) |
| SingleUser | bool | シングルユーザーモード有効 |
| SingleUserName | string | シングルユーザー許可アカウント |
| NoLoggingToWinEvents | bool | Windowsイベントログ無効 |
| StartAsNamedInstance | bool | 名前付きインスタンス起動 |
| DisableMonitoring | bool | 監視無効化 |
| IncreasedExtents | bool | エクステント増加有効 |
| ParameterString | string | 生の起動パラメータ文字列 |

### Get-DbaStartupParameter 出力プロパティ（-Simpleモード）

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全なインスタンス名 |
| MasterData | string | masterデータベースデータファイルパス |
| MasterLog | string | masterデータベースログファイルパス |
| ErrorLog | string | エラーログファイルパス |
| TraceFlags | int[]/string | トレースフラグ配列または"None" |
| DebugFlags | int[]/string | デバッグフラグ配列または"None" |
| ParameterString | string | 生の起動パラメータ文字列 |

## イベント仕様

### 1-Get-DbaStartupParameter実行

1. Resolve-DbaNetworkNameでコンピュータ名を解決
2. Invoke-ManagedComputerCommandでWMI経由でサービス情報取得
3. StartupParametersを ";" で分割
4. 各パラメータを解析（-d, -l, -e, -T, -t等）
5. フラグパラメータ（-c, -f, -g, -m, -n, -s, -x, -E）を判定
6. 結果をPSCustomObjectとして出力

### 2-Set-DbaStartupParameter実行

1. オンラインの場合、SQL Serverに接続（パス検証用）
2. Get-DbaStartupParameterで現在の設定を取得
3. StartupConfigが指定された場合、その値を使用
4. 各パラメータに対してパス検証（オンライン時）
5. パラメータ文字列を構築
6. Invoke-ManagedComputerCommandでWMI経由でStartupParametersを更新
7. 変更後の設定を取得して出力
8. "サービス再起動が必要"のメッセージを追加

## データベース更新仕様

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| Get-DbaStartupParameter | - | WMI読取 | Windowsサービス構成からの読み取り |
| Set-DbaStartupParameter | Windowsレジストリ | WMI更新 | Windowsサービス構成の更新 |

### テーブル別更新項目詳細

#### WMI ManagedComputer.Services

| 操作 | 項目 | 更新値・取得条件 | 備考 |
|-----|-----|-----------------|------|
| UPDATE | StartupParameters | 構築したパラメータ文字列 | セミコロン区切りの起動パラメータ |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 発生条件 |
|-------------|------|--------------|----------|
| MSG001 | 情報 | "Startup parameters changed on $instance. You must restart SQL Server for changes to take effect." | 設定変更成功時 |
| MSG002 | 警告 | "Working offline, skipping untested MasterData path" | オフラインモードでパス指定時 |
| MSG003 | エラー | "Specified folder for MasterData file is not reachable by instance $instance" | パス検証失敗時 |
| MSG004 | エラー | "MasterData value must be provided" | 必須値未指定時 |
| MSG005 | エラー | "Startup parameter update failed on $instance" | WMI更新失敗時 |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| WMI接続失敗 | Stop-Functionでエラー出力し、Continueで次のインスタンスへ |
| パス検証失敗 | Stop-Functionでエラー出力し、return |
| 必須パラメータ欠如 | Stop-Functionでエラー出力し、return |
| WMI更新失敗 | Stop-Functionでエラー出力し、return |

## 備考

- SQL Serverに接続せずWMI経由で設定を取得・変更するため、起動不能時の診断に有効
- 変更はSQL Serverサービス再起動まで反映されない
- Forceパラメータでオフライン時のパス検証をスキップ可能
- StartupConfigによる設定のバックアップ/リストアが可能
- 管理者権限（Elevation）が必要

---

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

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

### 推奨読解順序

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

WMIのStartupParametersプロパティがセミコロン区切りの文字列であることを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaStartupParameter.ps1 | `public/Get-DbaStartupParameter.ps1` | 出力オブジェクトの構造（行186-205）を確認 |

**読解のコツ**: StartupParametersの解析ロジック（行111-129）で各パラメータの接頭辞（-d, -l, -e等）を理解する

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaStartupParameter.ps1 | `public/Get-DbaStartupParameter.ps1` | param()ブロック（行81-88）でパラメータ定義を確認 |
| 2-2 | Set-DbaStartupParameter.ps1 | `public/Set-DbaStartupParameter.ps1` | param()ブロック（行217-240）でパラメータ定義を確認 |

**主要処理フロー**:
1. **行92-95**: インスタンス情報の抽出とコンピュータ名解決
2. **行104-207**: ScriptBlock内でWMI経由のパラメータ解析
3. **行211-215**: Invoke-ManagedComputerCommandでスクリプトブロック実行

#### Step 3: パラメータ解析ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaStartupParameter.ps1 | `public/Get-DbaStartupParameter.ps1` | 各パラメータの解析（行113-128） |

**主要処理フロー**:
- **行113-117**: -d, -l, -e, -T, -tパラメータの抽出
- **行119-129**: トレースフラグとデバッグフラグの変換
- **行146-177**: 各種フラグパラメータの判定

#### Step 4: パラメータ設定ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Set-DbaStartupParameter.ps1 | `public/Set-DbaStartupParameter.ps1` | パラメータ文字列構築（行290-424） |

**主要処理フロー**:
- **行290-308**: MasterDataパスの処理と検証
- **行310-327**: ErrorLogパスの処理と検証
- **行329-346**: MasterLogパスの処理と検証
- **行370-424**: フラグパラメータの文字列構築

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

```
Get-DbaStartupParameter
    │
    ├─ Resolve-DbaNetworkName
    │      └─ コンピュータ名解決
    │
    └─ Invoke-ManagedComputerCommand
           │
           ├─ WMI ManagedComputer接続
           │
           ├─ $wmi.Services取得
           │      └─ SQL Serverサービス情報
           │
           └─ StartupParameters解析
                  └─ PSCustomObject生成

Set-DbaStartupParameter
    │
    ├─ Connect-DbaInstance（オンライン時）
    │      └─ パス検証用接続
    │
    ├─ Get-DbaStartupParameter
    │      └─ 現在設定の取得
    │
    ├─ Test-DbaPath（オンライン時）
    │      └─ パス存在検証
    │
    ├─ パラメータ文字列構築
    │
    └─ Invoke-ManagedComputerCommand
           │
           ├─ $wmiSvc.StartupParameters = $parameterString
           │
           └─ $wmiSvc.Alter()
```

### データフロー図

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

SqlInstance ───────▶ Resolve-DbaNetworkName ───────▶ ComputerName
                           │
                           ▼
                    Invoke-ManagedComputerCommand
                           │
                           ▼
                    WMI Services取得
                           │
                           ▼
                    StartupParameters取得
                           │
                           ▼
                    セミコロン分割・解析
                           │
                           ▼
                    PSCustomObject生成 ───────▶ 起動パラメータオブジェクト
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaStartupParameter.ps1 | `public/Get-DbaStartupParameter.ps1` | ソース | 起動パラメータ取得コマンド |
| Set-DbaStartupParameter.ps1 | `public/Set-DbaStartupParameter.ps1` | ソース | 起動パラメータ設定コマンド |
| Invoke-ManagedComputerCommand.ps1 | `internal/functions/Invoke-ManagedComputerCommand.ps1` | ソース | WMI操作の内部関数 |
| Resolve-DbaNetworkName.ps1 | `public/Resolve-DbaNetworkName.ps1` | ソース | コンピュータ名解決 |
| Test-DbaPath.ps1 | `public/Test-DbaPath.ps1` | ソース | パス存在検証 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続（パス検証用） |
