# 画面設計書 250-ユーザーオプション

## 概要

本ドキュメントは、dbatools PowerShellモジュールの `Get-DbaInstanceUserOption` コマンドに関する画面設計書です。SQL Serverインスタンスレベルのデフォルトユーザーオプション設定を取得する機能を提供します。

### 本画面の処理概要

`Get-DbaInstanceUserOption` コマンドは、SQL Serverインスタンスで新規データベース接続に自動的に適用されるデフォルトユーザーオプション設定を取得する機能を提供します。

**業務上の目的・背景**：SQL Serverのユーザーオプション設定（ANSI_NULLS、QUOTED_IDENTIFIER、ANSI_PADDING等）は、クエリの動作に大きな影響を与えます。これらの設定はインスタンスレベルでデフォルト値が設定され、新しいデータベース接続に継承されます。異なる環境間でアプリケーションの動作が異なる場合、このユーザーオプション設定の違いが原因であることがあります。本コマンドは、インスタンス間の設定比較、環境標準化の監査、接続動作問題の診断に使用されます。`Get-DbaDbccUserOption`が現在のセッション設定を返すのに対し、本コマンドはインスタンスのデフォルト設定を返します。

**画面へのアクセス方法**：PowerShellコンソールまたはPowerShell ISEから `Get-DbaInstanceUserOption` コマンドを直接実行します。SqlInstanceパラメータで対象SQL Serverインスタンスを指定します。

**主要な操作・処理内容**：
1. SQL Serverインスタンスへの接続
2. SMO経由でUserOptionsプロパティコレクション取得
3. 各プロパティにインスタンス情報を付加
4. Select-DefaultViewで表示プロパティを選択して出力

**画面遷移**：CLIコマンドのため画面遷移はありません。複数のSQL Serverインスタンスに対してパイプライン経由で実行可能です。

**権限による表示制御**：SQL Serverへの接続権限があれば実行可能です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 558 | Get-DbaInstanceUserOption | 主機能 | インスタンスユーザーオプションの取得 |
| - | Connect-DbaInstance | 補助機能 | SQL Serverインスタンスへの接続 |
| - | Get-DbaDbccUserOption | 関連機能 | 現在のセッションのユーザーオプション取得 |

## 画面種別

CLI（コマンドラインインターフェース）/ 情報取得系

## URL/ルーティング

PowerShellコマンド: `Get-DbaInstanceUserOption`

## 入出力項目

### 入力パラメータ

| パラメータ名 | 型 | 必須 | パイプライン | 説明 |
|-------------|----|----|-------------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | Yes | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | No | SQL Server認証用の資格情報 |
| EnableException | switch | No | No | 例外を詳細表示するフラグ |

## 表示項目

### 出力オブジェクト（Microsoft.SqlServer.Management.Smo.Property + 拡張プロパティ）

#### デフォルト表示項目

| 項目名 | 型 | 説明 |
|--------|----|----|
| ComputerName | string | SQL Serverホストのコンピュータ名 |
| InstanceName | string | SQL Serverサービス名 |
| SqlInstance | string | 完全修飾SQL Serverインスタンス名 |
| Name | string | ユーザーオプション名 |
| Value | object | ユーザーオプションの現在値（ON/OFFまたは数値） |

#### 一般的なユーザーオプション

| オプション名 | 説明 |
|-------------|------|
| ANSI_NULLS | NULL比較がANSI標準に従うか |
| QUOTED_IDENTIFIER | 引用符で囲まれた識別子の動作 |
| ANSI_PADDING | 文字列の右側空白処理 |
| ANSI_WARNINGS | 集計関数でのNULL警告 |
| ARITHABORT | 算術エラー時のクエリ中止 |
| CONCAT_NULL_YIELDS_NULL | NULL連結の結果 |
| CURSOR_CLOSE_ON_COMMIT | コミット時のカーソルクローズ |
| NUMERIC_ROUNDABORT | 精度低下時のエラー |
| IMPLICIT_TRANSACTIONS | 暗黙的トランザクション |

## イベント仕様

### 1-コマンド実行

コマンド実行時の処理フロー:

1. **接続処理**: `Connect-DbaInstance` でSQL Serverに接続
2. **プロパティ取得**: `$server.useroptions.properties` でユーザーオプションプロパティ取得
3. **情報付加**: 各プロパティオブジェクトにComputerName, InstanceName, SqlInstanceを追加
4. **結果出力**: Select-DefaultViewで指定プロパティを表示

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| コマンド実行 | - | SELECT | データベースへの書き込みなし（SMO経由でメタデータ読み取り） |

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

本コマンドはデータベースへの更新を行いません。SMOを介してサーバー設定を取得するのみです。

## メッセージ仕様

| メッセージID | レベル | メッセージ内容 | 発生条件 |
|-------------|--------|--------------|----------|
| - | Error | Failure | SQL Server接続に失敗した場合 |

## 例外処理

| 例外種別 | 発生条件 | 処理内容 |
|---------|---------|---------|
| 接続エラー | SQL Serverへの接続失敗 | Stop-Functionでエラー記録、次のインスタンスへ続行 |

## 備考

- インスタンスレベルのデフォルト設定を返す（セッション設定ではない）
- ユーザーオプションは `sp_configure 'user options'` で設定可能
- 各オプションはビットマスクで管理される
- アプリケーション接続時の動作に影響
- Get-DbaDbccUserOptionは現在のセッション設定を返す（異なる目的）

---

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

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

### 推奨読解順序

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

出力オブジェクトの構造を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaInstanceUserOption.ps1 | `public/Get-DbaInstanceUserOption.ps1` | 37-48行目: .OUTPUTSセクションで出力プロパティ定義 |
| 1-2 | Get-DbaInstanceUserOption.ps1 | `public/Get-DbaInstanceUserOption.ps1` | 86行目: Select-DefaultViewで表示プロパティ指定 |

**読解のコツ**: SMO Propertyオブジェクトに`Add-Member`で拡張プロパティを追加している点に注目。

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

処理の起点となる関数の構造を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaInstanceUserOption.ps1 | `public/Get-DbaInstanceUserOption.ps1` | 66-72行目: パラメータ定義 |
| 2-2 | Get-DbaInstanceUserOption.ps1 | `public/Get-DbaInstanceUserOption.ps1` | 74-89行目: processブロックのメインロジック |

**主要処理フロー**:
1. **75-80行目**: Connect-DbaInstanceでSQL Server接続
2. **81行目**: `$server.useroptions.properties` でプロパティ取得
3. **82-85行目**: 各プロパティにAdd-Memberで拡張情報追加
4. **86行目**: Select-DefaultViewで出力

#### Step 3: SMOユーザーオプションの理解

SMO UserOptionsオブジェクトの構造を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaInstanceUserOption.ps1 | `public/Get-DbaInstanceUserOption.ps1` | 81行目: $server.useroptions.propertiesのアクセス |

**主要処理フロー**:
- **81行目**: `$server.useroptions` はSMO UserOptionsオブジェクト
- **81行目**: `.properties` はPropertyCollectionを返す
- **82行目**: foreach ($prop in $props) で各プロパティを処理

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

```
Get-DbaInstanceUserOption
    │
    ├─ Connect-DbaInstance
    │      └─ SQL Server接続確立
    │
    └─ $server.useroptions.properties
           │
           └─ foreach ($prop in $props)
                  │
                  ├─ Add-Member (ComputerName)
                  ├─ Add-Member (InstanceName)
                  ├─ Add-Member (SqlInstance)
                  │
                  └─ Select-DefaultView
                         └─ ComputerName, InstanceName, SqlInstance, Name, Value
```

### データフロー図

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

SqlInstance ───▶ Connect-DbaInstance ───▶ $server オブジェクト
                            │
                            ▼
                 $server.useroptions.properties
                 (PropertyCollection)
                            │
                            ▼
               foreach ($prop in $props)
                            │
               ├─ Add-Member ComputerName
               ├─ Add-Member InstanceName
               └─ Add-Member SqlInstance
                            │
                            ▼
                    Select-DefaultView
                            │
                            ▼
              Microsoft.SqlServer.Management.Smo.Property
                    + 拡張プロパティ
              (ComputerName, InstanceName, SqlInstance, Name, Value)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaInstanceUserOption.ps1 | `public/Get-DbaInstanceUserOption.ps1` | ソース | メインコマンド実装 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続 |
| Select-DefaultView.ps1 | `internal/functions/Select-DefaultView.ps1` | ソース | 表示プロパティ制御 |
