# 機能設計書 558-Get-DbaInstanceUserOption

## 概要

本ドキュメントは、SQL Serverインスタンスレベルのユーザーオプションデフォルト設定を取得する機能について、その処理内容、入出力仕様、および実装詳細を記述した機能設計書である。

### 本機能の処理概要

Get-DbaInstanceUserOptionは、SQL Serverインスタンスレベルで設定されているデフォルトユーザーオプションを取得するPowerShellコマンドレットである。これらの設定は、新しいデータベース接続に自動的に適用されるANSI準拠オプション（ANSI_NULLS、QUOTED_IDENTIFIER等）や日付形式などのデフォルト値である。

**業務上の目的・背景**：SQL Serverインスタンスのユーザーオプション設定は、接続時のデフォルト動作を決定する。異なる環境でアプリケーションの動作が異なる場合、これらのインスタンスレベル設定の違いが原因であることがある。本機能は、インスタンス間での設定の標準化や、トラブルシューティング時の設定確認を支援する。

**機能の利用シーン**：
- インスタンス間の設定比較
- 新規インスタンスの設定検証
- デフォルト接続動作の確認
- 環境標準化のための設定監査

**主要な処理内容**：
1. 指定されたSQL Serverインスタンスへの接続
2. $server.useroptions.propertiesからユーザーオプション取得
3. 各プロパティへのインスタンス情報の付与
4. Select-DefaultViewで既定プロパティを選択して出力

**関連システム・外部連携**：
- SMO Server.UserOptionsプロパティの使用
- Connect-DbaInstanceによる接続管理

**権限による制御**：インスタンス設定の参照には、適切なサーバー権限が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 250 | ユーザーオプション | 主画面 | インスタンスユーザーオプションの取得 |

## 機能種別

データ取得（SELECT）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | Yes | 対象のSQL Serverインスタンス。パイプライン入力対応 | 有効なSQL Serverインスタンス名 |
| SqlCredential | PSCredential | No | 接続に使用する代替資格情報 | - |
| EnableException | switch | No | 例外処理の有効化 | - |

### 入力データソース

- SQL Serverインスタンス（$server.useroptions.properties）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverが稼働するコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| Name | string | ユーザーオプション名（ANSI_NULLS等） |
| Value | object | オプションの現在値（ON/OFF等） |

### 出力先

- PowerShellパイプライン（Microsoft.SqlServer.Management.Smo.Property型）

## 処理フロー

### 処理シーケンス

```
1. パラメータバインディング
   └─ SqlInstance、SqlCredentialの受け取り

2. processブロック
   └─ foreach ($instance in $SqlInstance) ループ

3. SQL Serverへの接続
   └─ Connect-DbaInstanceによる接続確立

4. ユーザーオプション取得
   └─ $server.useroptions.propertiesの参照

5. 結果の出力
   └─ foreach ($prop in $props) ループ
   └─ Add-Memberでインスタンス情報追加
   └─ Select-DefaultViewで既定プロパティ選択
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[パラメータ受け取り]
    B --> C{各インスタンスをループ}
    C --> D[Connect-DbaInstance]
    D --> E{接続成功?}
    E -->|No| F[Stop-Function / Continue]
    F --> C
    E -->|Yes| G[$server.useroptions.properties取得]
    G --> H{各propをループ}
    H --> I[Add-Member: ComputerName]
    I --> J[Add-Member: InstanceName]
    J --> K[Add-Member: SqlInstance]
    K --> L[Select-DefaultView]
    L --> H
    H -->|完了| C
    C -->|完了| M[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | パイプライン入力 | SqlInstanceパラメータはパイプラインからの入力を受け付ける | 常時 |
| BR-002 | 全プロパティ出力 | フィルタオプションなし、全ユーザーオプションを返却 | 常時 |

### 計算ロジック

特になし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 設定取得 | - | SMO | SMO経由でインスタンス設定取得 |

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

#### SMO Server.UserOptions

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| 参照 | Properties | 全ユーザーオプション | SMOのUserOptionsオブジェクト経由 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| ConnectionError | 接続エラー | SQL Serverへの接続失敗 | Stop-Functionで警告、次のインスタンスへ継続 |

### リトライ仕様

リトライは実装されていない。

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

読み取り専用操作のため、トランザクション制御は不要。

## パフォーマンス要件

- SMO経由でのメタデータ取得のため、通常は高速に完了
- ユーザーオプションは少数（約9個）のため、処理は軽量

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

- インスタンス設定の参照権限が必要
- 設定情報のみを返却し、機密データは含まない

## 備考

- Get-DbaDbccUserOptionとの違い: こちらはインスタンスのデフォルト設定、前者は現在のセッション設定
- 主なユーザーオプション: ANSI_NULLS, QUOTED_IDENTIFIER, ANSI_PADDING, ANSI_WARNINGS, ARITHABORT, CONCAT_NULL_YIELDS_NULL, CURSOR_CLOSE_ON_COMMIT, NUMERIC_ROUNDABORT, IMPLICIT_TRANSACTIONS

---

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

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

### 推奨読解順序

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

SMO Propertyオブジェクトの構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaInstanceUserOption.ps1 | `public/Get-DbaInstanceUserOption.ps1` | 出力型（.OUTPUTS）セクション（36-47行目） |

**読解のコツ**: SMO PropertyオブジェクトはName/Valueペアを持つシンプルな構造。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaInstanceUserOption.ps1 | `public/Get-DbaInstanceUserOption.ps1` | function宣言とparamブロック（66-72行目） |

**主要処理フロー**:
1. **66-72行目**: パラメータ定義（DefaultParameterSetNameあり）
2. **74行目**: processブロック開始
3. **75行目**: foreachループでインスタンス処理開始

#### Step 3: ユーザーオプション取得を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaInstanceUserOption.ps1 | `public/Get-DbaInstanceUserOption.ps1` | ユーザーオプション取得（81行目） |

**主要処理フロー**:
- **81行目**: $server.useroptions.propertiesで全ユーザーオプション取得

#### Step 4: 出力処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Get-DbaInstanceUserOption.ps1 | `public/Get-DbaInstanceUserOption.ps1` | 出力オブジェクト生成（82-86行目） |

**主要処理フロー**:
- **83-85行目**: Add-MemberでComputerName、InstanceName、SqlInstance追加
- **86行目**: Select-DefaultViewで既定プロパティ選択

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

```
Get-DbaInstanceUserOption
    │
    ├─ Connect-DbaInstance
    │      └─ SQL Server SMO接続
    │
    ├─ $server.useroptions.properties
    │      └─ SMO UserOptionsプロパティコレクション
    │
    ├─ Add-Member（プロパティ追加）
    │
    └─ Select-DefaultView（出力整形）
```

### データフロー図

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

SqlInstance ───▶ Connect-DbaInstance ───▶ SMO Server
                        │
                        ▼
              $server.useroptions.properties
                        │
                        ▼
              foreach ($prop in $props)
                        │
                        ▼
              Add-Member ───▶ インスタンス情報付与
                        │
                        ▼
              Select-DefaultView ───▶ パイプライン出力
                                             │
                                             ▼
                                    Property Objects
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaInstanceUserOption.ps1 | `public/Get-DbaInstanceUserOption.ps1` | ソース | メイン実装 |
| Get-DbaDbccUserOption.ps1 | `public/Get-DbaDbccUserOption.ps1` | ソース | セッション設定取得（関連機能） |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続 |
