# 機能設計書 63-New-DbaDacProfile

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおける `New-DbaDacProfile` コマンドレットの機能設計書です。DACパッケージ（dacpac）のデプロイ用パブリッシュプロファイルXMLファイルを生成する機能について、その仕様と実装詳細を記述します。

### 本機能の処理概要

`New-DbaDacProfile` は、SqlPackage.exeやVisual Studio SSDTで使用されるパブリッシュプロファイルXMLファイルを生成するコマンドレットです。このプロファイルファイルにより、dacpacのデプロイ設定（ターゲットデータベース、接続情報、デプロイオプション）を標準化し、再利用可能にします。

**業務上の目的・背景**：データベースのデプロイメントにおいて、環境ごとに異なる接続設定やデプロイオプションを管理する必要があります。パブリッシュプロファイルを使用することで、デプロイ設定の一元管理、複数環境への一貫したデプロイ、CI/CDパイプラインでの自動化が可能になります。手動でXMLを作成する手間を省き、PowerShellから効率的にプロファイルを生成できます。

**機能の利用シーン**：
- 開発/テスト/本番環境ごとのデプロイプロファイル作成
- CI/CDパイプラインで使用するデプロイ設定の自動生成
- Visual Studio SSDTプロジェクトのパブリッシュ設定の外部生成
- SqlPackage.exeを使用した自動デプロイの設定準備

**主要な処理内容**：
1. SQL Serverインスタンスへの接続（SqlInstance指定時）
2. 接続文字列の取得または直接使用
3. XMLテンプレートに接続情報とデプロイオプションを埋め込み
4. 指定パスにパブリッシュプロファイルXMLファイルを出力

**関連システム・外部連携**：
- SQL Server インスタンス（接続文字列取得のため）
- SqlPackage.exe（生成プロファイルの使用先）
- Visual Studio SSDT（生成プロファイルの使用先）
- ファイルシステム（XML出力）

**権限による制御**：
- SQL Serverへの接続権限（SqlInstance使用時）
- 出力ディレクトリへの書き込み権限

## 関連画面

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

## 機能種別

ファイル生成処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstance[] | No | 接続先SQL Serverインスタンス | パイプライン入力可 |
| SqlCredential | PSCredential | No | 認証用資格情報 | - |
| Database | string[] | Yes | ターゲットデータベース名 | 必須 |
| Path | string | No | 出力ディレクトリ。デフォルト: Documents | ディレクトリ存在チェック |
| ConnectionString | string[] | No | 直接指定の接続文字列 | - |
| PublishOptions | hashtable | No | 追加のデプロイオプション | - |
| EnableException | switch | No | 例外を有効にするフラグ | - |

### 入力データソース

- SqlInstanceからの接続文字列取得
- または直接指定のConnectionString

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Server名 |
| Database | string | ターゲットデータベース名 |
| FileName | string | 生成されたXMLファイルのフルパス |
| ConnectionString | string | プロファイルに埋め込まれた接続文字列 |
| ProfileTemplate | string | 生成されたXML内容（デフォルト表示から除外） |

### 出力先

- PowerShellパイプライン（PSCustomObject）
- ファイルシステム（.xml パブリッシュプロファイル）

## 処理フロー

### 処理シーケンス

```
1. パラメータ検証
   └─ SqlInstanceまたはConnectionStringのいずれかが必要
2. パス存在確認
   └─ 出力ディレクトリの存在とアクセス可能性を確認
3. インスタンス接続（SqlInstance指定時）
   └─ Connect-DbaInstanceで接続し接続文字列を取得
4. 各接続文字列・データベースの組み合わせで処理
   └─ XMLテンプレート生成
5. XMLファイル出力
   └─ 「インスタンス名-データベース名-publish.xml」形式で保存
6. 結果オブジェクト出力
   └─ PSCustomObjectをパイプラインに出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{SqlInstance or ConnectionString指定?}
    B -->|両方なし| C[Stop-Function]
    B -->|あり| D{Path存在?}
    D -->|No| C
    D -->|Yes| E{Pathはディレクトリ?}
    E -->|No| C
    E -->|Yes| F{SqlInstance指定?}
    F -->|Yes| G[Connect-DbaInstance]
    G --> H[ConnectionString取得]
    F -->|No| I[直接ConnectionString使用]
    H --> J[各ConnectionStringでループ]
    I --> J
    J --> K[各Databaseでループ]
    K --> L[XMLテンプレート生成]
    L --> M[ファイル出力]
    M --> N[PSCustomObject出力]
    N --> O{次のDatabase?}
    O -->|Yes| K
    O -->|No| P{次のConnectionString?}
    P -->|Yes| J
    P -->|No| Q[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | パスデフォルト | Pathが指定されない場合はDocumentsフォルダを使用 | Path未指定時 |
| BR-02 | ファイル名規則 | 出力ファイル名は「インスタンス名-データベース名-publish.xml」形式 | 常時 |
| BR-03 | 接続文字列クリーンアップ | dbatools固有の接続文字列パラメータを除去 | SqlInstance使用時 |
| BR-04 | 必須パラメータ | SqlInstanceまたはConnectionStringのいずれかが必要 | 常時 |

### 計算ロジック

該当なし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 接続確認 | - | SELECT | Connect-DbaInstanceでの接続テスト |

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

データベースの読み書きは行いません（接続文字列取得のみ）。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | パラメータ不足 | SqlInstanceとConnectionStringの両方が未指定 | いずれかを指定 |
| - | パス不存在 | 指定Pathが存在しない | パスを確認・作成 |
| - | パス種別エラー | 指定Pathがディレクトリでない | ディレクトリパスを指定 |
| - | 接続失敗 | SQL Serverへの接続に失敗 | 接続情報を確認 |
| - | ファイル出力失敗 | XMLファイルの書き込みに失敗 | 権限を確認 |

### リトライ仕様

リトライ処理なし

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

該当なし

## パフォーマンス要件

- 軽量なファイル生成処理のため、秒単位で完了

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

- 生成されるXMLファイルに接続文字列が含まれるため、ファイルのアクセス権限管理が重要
- 機密性の高い環境では、資格情報を含まない接続文字列を使用し、実行時に認証を行うことを推奨

## 備考

- 生成されたプロファイルはVisual Studioの「プロファイルの読み込み」機能で使用可能
- 「詳細設定」ボタンから追加のデプロイオプションを設定可能

---

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

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

### 推奨読解順序

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

生成されるXMLテンプレートの構造を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | New-DbaDacProfile.ps1 | `public/New-DbaDacProfile.ps1` | 143-158行目: Get-Template関数によるXML構造定義 |

**読解のコツ**: MSBuildプロジェクト形式のXMLで、PropertyGroup内にデプロイ設定を記述。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | New-DbaDacProfile.ps1 | `public/New-DbaDacProfile.ps1` | 106-117行目: パラメータ定義 |

**主要処理フロー**:
1. **106-117行目**: パラメータ定義（Database必須、Path/SqlInstance等オプション）
2. **118-130行目**: begin ブロック - パラメータ検証
3. **174-214行目**: process ブロック - メイン処理

#### Step 3: 内部関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | New-DbaDacProfile.ps1 | `public/New-DbaDacProfile.ps1` | ヘルパー関数 |

**主要処理フロー**:
- **131-141行目**: Convert-HashtableToXMLString - PublishOptionsをXML要素に変換
- **143-158行目**: Get-Template - XMLテンプレート生成
- **160-172行目**: Get-ServerName - 接続文字列からサーバー名を抽出

#### Step 4: メイン処理ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | New-DbaDacProfile.ps1 | `public/New-DbaDacProfile.ps1` | process ブロック |

**主要処理フロー**:
- **177-186行目**: SqlInstance接続と接続文字列取得
- **188-213行目**: 各ConnectionString/Databaseの組み合わせでXML生成・出力

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

```
New-DbaDacProfile (public/New-DbaDacProfile.ps1)
    │
    ├─ Connect-DbaInstance (SqlInstance指定時)
    │      └─ 接続文字列取得
    │
    ├─ Convert-HashtableToXMLString (内部関数)
    │      └─ PublishOptionsをXML要素に変換
    │
    ├─ Get-Template (内部関数)
    │      └─ XMLテンプレート生成
    │
    ├─ Get-ServerName (内部関数)
    │      └─ 接続文字列からサーバー名抽出
    │
    └─ Out-File
           └─ XMLファイル出力
```

### データフロー図

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

SqlInstance ──────▶ Connect-DbaInstance ──┐
      or                                   │
ConnectionString ─────────────────────────┼──▶ Get-Template ──▶ XMLテンプレート
                                          │                          │
Database ─────────────────────────────────┘                          │
                                                                     ▼
PublishOptions ──────────▶ Convert-HashtableToXMLString ──▶ <PropertyGroup>要素
                                                                     │
                                                                     ▼
                                                              Out-File
                                                                     │
                                                                     ▼
                                                         .xml パブリッシュプロファイル
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| New-DbaDacProfile.ps1 | `public/New-DbaDacProfile.ps1` | ソース | メイン実装ファイル |
| New-DbaDacProfile.Tests.ps1 | `tests/New-DbaDacProfile.Tests.ps1` | テスト | 単体テスト |
| Publish-DbaDacPackage.ps1 | `public/Publish-DbaDacPackage.ps1` | ソース | 生成プロファイルの使用先 |
| New-DbaDacOption.ps1 | `public/New-DbaDacOption.ps1` | ソース | プロファイル読み込み機能 |
