# 画面設計書 206-DACオプション

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおけるDACオプション作成機能の設計仕様を定義するものである。

### 本画面の処理概要

DACオプション機能は、DACパッケージのエクスポートやデプロイメントで使用するオプションオブジェクトを作成する機能を提供する。Export-DbaDacPackageやPublish-DbaDacPackageに渡す設定オブジェクトを生成するヘルパー機能である。

**業務上の目的・背景**：DACパッケージの操作では、コマンドタイムアウト、テーブルデータの抽出、スキーマ変更時の動作など、多くの設定オプションが存在する。これらのオプションはMicrosoft.SqlServer.Dac名前空間の専用クラスで管理される。本機能は、これらのクラスのインスタンス生成を簡素化し、PowerShellユーザーがSMOアセンブリ名を覚える必要なく適切なオプションオブジェクトを作成できるようにする。

**画面へのアクセス方法**：PowerShellコンソールから`New-DbaDacOption`コマンドを実行する。

**主要な操作・処理内容**：
1. TypeとActionに基づく適切なオプションクラスの選択
2. DacExtractOptions（Dacpac Export用）の作成
3. DacExportOptions（Bacpac Export用）の作成
4. PublishOptions（Dacpac Publish用）の作成
5. DacImportOptions（Bacpac Publish用）の作成
6. PublishXmlからのデプロイオプション読み込み
7. Propertyハッシュテーブルによる初期値設定

**画面遷移**：
- 入力元：管理者またはスクリプトからのコマンド実行
- 出力先：Export-DbaDacPackage、Publish-DbaDacPackageへのパイプライン
- 関連機能：Export-DbaDacPackage、Publish-DbaDacPackage、New-DbaDacProfile

**権限による表示制御**：特に権限は不要（オブジェクト生成のみ）。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 61 | New-DbaDacOption | 主機能 | DACオプションの作成 |
| 60 | Export-DbaDacPackage | 利用先機能 | DACパッケージのエクスポート |
| 64 | Publish-DbaDacPackage | 利用先機能 | DACパッケージの公開 |

## 画面種別

コマンドラインインターフェース（CLI）/ ヘルパー関数

## URL/ルーティング

```powershell
# Export用オプション作成
$options = New-DbaDacOption -Type Dacpac -Action Export

# Publish用オプション作成（プロファイル付き）
$options = New-DbaDacOption -Type Dacpac -Action Publish -PublishXml <プロファイルパス>
```

## 入出力項目

| パラメータ名 | 型 | 必須 | 既定値 | 説明 |
|-------------|-----|------|--------|------|
| Type | string | No | Dacpac | パッケージ種別（Dacpac/Bacpac） |
| Action | string | Yes | - | アクション（Publish/Export） |
| PublishXml | string | No | - | 公開プロファイルXMLパス |
| Property | hashtable | No | - | 初期プロパティ設定 |
| EnableException | switch | No | $false | 例外の有効化 |
| WhatIf | switch | No | - | 実行内容のプレビュー |
| Confirm | switch | No | - | 実行確認プロンプト |

### Type と Action の組み合わせ

| Type | Action | 生成されるクラス |
|------|--------|-----------------|
| Dacpac | Export | Microsoft.SqlServer.Dac.DacExtractOptions |
| Bacpac | Export | Microsoft.SqlServer.Dac.DacExportOptions |
| Dacpac | Publish | Microsoft.SqlServer.Dac.PublishOptions |
| Bacpac | Publish | Microsoft.SqlServer.Dac.DacImportOptions |

## 表示項目

### DacExtractOptions（Dacpac Export）

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ExtractAllTableData | bool | 全テーブルデータを抽出 |
| CommandTimeout | int | コマンドタイムアウト（秒） |
| その他 | - | DacExtractOptionsの全プロパティ |

### DacExportOptions（Bacpac Export）

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| CommandTimeout | int | コマンドタイムアウト（秒） |
| その他 | - | DacExportOptionsの全プロパティ |

### PublishOptions（Dacpac Publish）

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| DeployOptions | DacDeployOptions | デプロイメントオプション |
| GenerateDeploymentScript | bool | デプロイスクリプト生成 |
| GenerateDeploymentReport | bool | デプロイレポート生成 |

### DacImportOptions（Bacpac Publish）

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| CommandTimeout | int | コマンドタイムアウト（秒） |
| その他 | - | DacImportOptionsの全プロパティ |

## イベント仕様

### 1-オプション作成イベント

1. TypeとActionパラメータの検証
2. 対応するクラス名の決定
3. Propertyパラメータによる初期化（指定時）
4. PublishXml読み込み（Publish時、指定時）
5. DeployOptionsの構築（Publish時）
6. オプションオブジェクトの返却

### 2-PublishXml読み込みイベント（Dacpac Publish時）

1. PublishXmlパスの検証
2. DacProfile.Load()によるプロファイル読み込み
3. DeployOptionsのコピー
4. GenerateDeploymentScriptの初期化

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

本機能はオブジェクト生成のみであり、データベース操作は発生しない。

## メッセージ仕様

| 種別 | メッセージ | 条件 |
|------|----------|------|
| エラー | "Could not generate object $TypeName" | オブジェクト生成失敗時 |
| エラー | "Could not load profile." | プロファイル読み込み失敗時 |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| オブジェクト生成失敗 | Stop-Functionでエラー記録 |
| プロファイル読み込み失敗 | Stop-Functionでエラー記録、return |

## 備考

- Microsoft.SqlServer.Dacアセンブリがdbatools.libraryから提供される
- Propertyパラメータでネストしたハッシュテーブル（DeployOptions内のオプション）も指定可能
- GenerateDeploymentScriptのデフォルトはfalse

---

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

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

### 推奨読解順序

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

出力されるオプションクラスの種類と特徴を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | New-DbaDacOption.ps1 | `public/New-DbaDacOption.ps1` | 出力クラスの種類（行57-81） |

**読解のコツ**: TypeとActionの組み合わせで4種類のクラスが生成される点に注目。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | New-DbaDacOption.ps1 | `public/New-DbaDacOption.ps1` | パラメータ定義（行104-114） |

**主要処理フロー**:
1. **行115**: process{}ブロック開始
2. **行116**: ShouldProcessによる確認
3. **行117-127**: New-DacObject内部関数定義
4. **行130-135**: Export用オプション生成
5. **行136-161**: Publish用オプション生成

#### Step 3: Export用オプション生成を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | New-DbaDacOption.ps1 | `public/New-DbaDacOption.ps1` | Export分岐（行130-135） |

**主要処理フロー**:
- **行131-132**: Type=Dacpac → DacExtractOptions
- **行133-134**: Type=Bacpac → DacExportOptions

#### Step 4: Publish用オプション生成を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | New-DbaDacOption.ps1 | `public/New-DbaDacOption.ps1` | Publish分岐（行136-161） |

**主要処理フロー**:
- **行137-157**: Type=Dacpac → PublishOptions
  - **行139-146**: PublishXml指定時のプロファイル読み込み
  - **行148-152**: Property指定時のDeployOptions構築
  - **行154-156**: GenerateDeploymentScriptの初期化
- **行158-159**: Type=Bacpac → DacImportOptions

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

```
New-DbaDacOption
    |
    +-- process{}
           +-- ShouldProcess確認
           +-- New-DacObject (内部関数)
           |      +-- New-Object @dacOptionSplat
           |
           +-- Action=Export の場合
           |      +-- Type=Dacpac → DacExtractOptions
           |      +-- Type=Bacpac → DacExportOptions
           |
           +-- Action=Publish の場合
                  +-- Type=Dacpac → PublishOptions
                  |      +-- PublishXml指定時
                  |      |      +-- DacProfile.Load()
                  |      +-- Property.DeployOptions指定時
                  |             +-- DacDeployOptions構築
                  +-- Type=Bacpac → DacImportOptions
```

### データフロー図

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

Type (Dacpac/Bacpac) --+
                       |
Action (Export/Publish)+----> クラス選択 ----> New-Object ----> オプションオブジェクト
                       |           |
Property (hashtable) --+           |
                                   v
PublishXml (パス) ------> DacProfile.Load() ----+
                                                |
                          DeployOptions構築 <---+
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| New-DbaDacOption.ps1 | `public/New-DbaDacOption.ps1` | ソース | メインコマンド実装 |
| Export-DbaDacPackage.ps1 | `public/Export-DbaDacPackage.ps1` | ソース | オプションの利用先 |
| Publish-DbaDacPackage.ps1 | `public/Publish-DbaDacPackage.ps1` | ソース | オプションの利用先 |
| New-DbaDacProfile.ps1 | `public/New-DbaDacProfile.ps1` | ソース | プロファイル作成（関連） |
