# 機能設計書 64-Publish-DbaDacPackage

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおける `Publish-DbaDacPackage` コマンドレットの機能設計書です。DACPACまたはBACPACファイルをSQL Serverデータベースにデプロイする機能について、その仕様と実装詳細を記述します。

### 本機能の処理概要

`Publish-DbaDacPackage` は、DacFxフレームワークを使用してDACPAC（スキーマ）またはBACPAC（スキーマ+データ）ファイルをSQL Serverデータベースにデプロイするコマンドレットです。SSDTプロジェクトやExport-DbaDacPackageで作成されたパッケージを、ターゲットデータベースに適用します。

**業務上の目的・背景**：データベースのスキーマ変更を手動で同期する作業は、煩雑でエラーが発生しやすいプロセスです。本機能を使用することで、DACPACファイルに定義されたスキーマをターゲットデータベースに自動的に適用し、差分を自動計算して変更スクリプトを生成・実行します。CI/CDパイプラインでの自動デプロイ、環境間のスキーマ同期、本番リリースの標準化に不可欠な機能です。

**機能の利用シーン**：
- CI/CDパイプラインでの自動データベースデプロイ
- 開発環境から本番環境へのスキーマ移行
- データベーススキーマのバージョン管理と展開
- BACPACによる完全なデータベース復元
- デプロイ前の変更スクリプトレビュー（ScriptOnlyモード）

**主要な処理内容**：
1. SQL Serverインスタンスへの接続
2. DACPAC/BACPACファイルの読み込み
3. パブリッシュプロファイルまたはDacOptionの適用
4. デプロイの実行またはスクリプト生成
5. デプロイレポートの生成（オプション）
6. 結果の出力

**関連システム・外部連携**：
- Microsoft.SqlServer.Dac（DacFx Framework）
- SQL Server インスタンス
- パブリッシュプロファイルXML（オプション）
- ファイルシステム（DACPAC/BACPAC、出力スクリプト）

**権限による制御**：
- ターゲットデータベースへの適切な権限（CREATE, ALTER, DROP等）
- 新規データベース作成時はdb_creator権限
- システムオブジェクト変更時はsysadmin権限

## 関連画面

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

## 機能種別

データベース操作（DDL実行）/ ファイル処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstance[] | No | 接続先SQL Serverインスタンス | - |
| SqlCredential | PSCredential | No | 認証用資格情報 | - |
| Path | string | Yes | DACPAC/BACPACファイルパス | パイプライン入力可 |
| PublishXml | string | No | パブリッシュプロファイルXMLパス | ファイル存在チェック |
| Database | string[] | Yes | ターゲットデータベース名 | パイプライン入力可 |
| ConnectionString | string[] | No | 直接指定の接続文字列 | - |
| GenerateDeploymentReport | switch | No | デプロイレポートXML生成フラグ | - |
| ScriptOnly | switch | No | スクリプト生成のみ（実行しない） | - |
| Type | string | No | パッケージタイプ（Dacpac/Bacpac）。デフォルト: Dacpac | ValidateSet |
| DacOption | object | No | デプロイオプションオブジェクト | 型チェック |
| OutputPath | string | No | スクリプト/レポートの出力先 | - |
| IncludeSqlCmdVars | switch | No | SqlCmd変数の置換を有効化 | - |
| EnableException | switch | No | 例外を有効にするフラグ | - |
| DacFxPath | string | No | カスタムDacFx DLLパス | - |

### 入力データソース

- DACPAC/BACPACファイル
- パブリッシュプロファイルXML（オプション）
- DacOptionオブジェクト（オプション）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Server名 |
| Database | string | ターゲットデータベース名 |
| Dacpac/Bacpac | string | デプロイしたパッケージファイルパス |
| PublishXml | string | 使用したパブリッシュプロファイル（Dacpac時） |
| Result | string | デプロイ結果メッセージ |
| DeployOptions | object | 使用されたデプロイオプション |
| SqlCmdVariableValues | string[] | 適用されたSqlCmd変数名（Dacpac時） |
| DatabaseScriptPath | string | 生成されたスクリプトパス（ScriptOnly時） |
| MasterDbScriptPath | string | masterデータベース用スクリプトパス（ScriptOnly時） |
| DeploymentReport | string | デプロイレポートXMLパス（GenerateDeploymentReport時） |

### 出力先

- PowerShellパイプライン（PSCustomObject）
- SQL Serverデータベース（スキーマ変更）
- ファイルシステム（スクリプト、レポート）

## 処理フロー

### 処理シーケンス

```
1. パラメータ検証
   └─ SqlInstanceまたはConnectionStringの必要性確認
2. DacFx読み込み（DacFxPath指定時）
   └─ カスタムDacFx DLLの読み込み
3. パッケージファイル読み込み
   └─ DacPackage.Load() または BacPackage.Load()
4. オプション設定
   └─ PublishXmlまたはDacOptionの読み込み・設定
5. SqlCmd変数置換（IncludeSqlCmdVars指定時）
   └─ 変数値の取得と設定
6. 各接続文字列・データベースでデプロイ実行
   └─ DacServices.Publish() または ImportBacpac()
7. スクリプト/レポート出力（該当オプション指定時）
   └─ ファイル出力
8. 結果オブジェクト出力
   └─ PSCustomObjectをパイプラインに出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{SqlInstance or ConnectionString?}
    B -->|なし| C[Stop-Function]
    B -->|あり| D{Pathファイル存在?}
    D -->|No| C
    D -->|Yes| E{Type判定}
    E -->|Dacpac| F[DacPackage.Load]
    E -->|Bacpac| G[BacPackage.Load]
    F --> H{PublishXml指定?}
    G --> I[DacImportOptions準備]
    H -->|Yes| J[New-DbaDacOption + PublishXml]
    H -->|No| K{DacOption指定?}
    K -->|Yes| L[DacOptionを使用]
    K -->|No| M[New-DbaDacOption デフォルト]
    J --> N[デプロイ実行ループ]
    L --> N
    M --> N
    I --> O[インポート実行ループ]
    N --> P{ScriptOnly?}
    P -->|Yes| Q[Script生成]
    P -->|No| R[Publish実行]
    Q --> S[結果出力]
    R --> S
    O --> S
    S --> T[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | Typeデフォルト | Typeが指定されない場合はDacpacをデフォルト | Type未指定時 |
| BR-02 | Type自動検出 | .bacpac拡張子の場合は自動的にBacpacタイプに設定 | 拡張子が.bacpac |
| BR-03 | Bacpac制限 | BacpacタイプではScriptOnlyとGenerateDeploymentReportは使用不可 | Type=Bacpac |
| BR-04 | DacOption型チェック | DacpacにはPublishOptions、BacpacにはDacImportOptionsが必要 | DacOption指定時 |
| BR-05 | OutputPathデフォルト | OutputPath未指定時はdbatools設定のエクスポートパスを使用 | OutputPath未指定 |

### 計算ロジック

該当なし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| Dacpac Publish | 全オブジェクト | CREATE/ALTER/DROP | スキーマ差分の適用 |
| Bacpac Import | 全テーブル | CREATE/INSERT | スキーマ作成とデータインポート |

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

デプロイ内容はDACPAC/BACPACファイルの内容に依存。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | パラメータ不足 | SqlInstanceとConnectionStringの両方が未指定 | いずれかを指定 |
| - | ファイル未発見 | Path指定ファイルが存在しない | パスを確認 |
| - | パッケージ読み込み失敗 | DACPAC/BACPACファイルが不正 | ファイルを再生成 |
| - | プロファイル読み込み失敗 | PublishXmlファイルが不正 | XMLを確認 |
| - | 接続失敗 | SQL Serverへの接続に失敗 | 接続情報を確認 |
| DacServicesException | デプロイ失敗 | スキーマ変更の実行に失敗 | エラー詳細を確認 |
| - | 型不一致 | DacOptionの型がTypeと不一致 | 正しい型を使用 |

### リトライ仕様

リトライ処理なし

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

- DacFxによるデプロイは内部でトランザクション管理
- デプロイオプションでロールバック動作を制御可能

## パフォーマンス要件

- 処理時間はデータベースサイズとスキーマ差分に依存
- 大規模データベースではタイムアウト設定の調整が必要
- CommandTimeoutオプションで制御可能

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

- 接続文字列に含まれる資格情報の保護
- デプロイ権限の最小化
- 本番環境へのデプロイは承認プロセスを経由することを推奨
- ScriptOnlyで変更内容を事前レビュー可能

## 備考

- DacFx NuGetパッケージはdbatools.libraryに含まれる
- カスタムDacFxバージョンはDacFxPathで指定可能

---

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

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

### 推奨読解順序

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

出力オブジェクトの構造とDacFxの主要クラスを理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Publish-DbaDacPackage.ps1 | `public/Publish-DbaDacPackage.ps1` | 386-413行目: 出力オブジェクトの構造定義 |

**読解のコツ**: DacpacとBacpacで出力プロパティが異なることに注意。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Publish-DbaDacPackage.ps1 | `public/Publish-DbaDacPackage.ps1` | 146-168行目: パラメータ定義 |

**主要処理フロー**:
1. **146-168行目**: パラメータ定義（ParameterSet使用）
2. **170-213行目**: begin ブロック - 初期化、DacFx読み込み
3. **215-418行目**: process ブロック - メイン処理

#### Step 3: パッケージ読み込みロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Publish-DbaDacPackage.ps1 | `public/Publish-DbaDacPackage.ps1` | パッケージ読み込み |

**主要処理フロー**:
- **226-228行目**: Type自動検出（.bacpac拡張子）
- **231-242行目**: DacOption型チェック
- **260-274行目**: パッケージファイル読み込み

#### Step 4: デプロイ実行ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Publish-DbaDacPackage.ps1 | `public/Publish-DbaDacPackage.ps1` | デプロイ処理 |

**主要処理フロー**:
- **330-334行目**: DacServicesオブジェクト作成
- **336-339行目**: メッセージイベント登録
- **341-359行目**: Dacpac Publish/Script または Bacpac Import

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

```
Publish-DbaDacPackage (public/Publish-DbaDacPackage.ps1)
    │
    ├─ Connect-DbaInstance (SqlInstance指定時)
    │
    ├─ Convert-ConnectionString
    │
    ├─ [Microsoft.SqlServer.Dac.DacPackage]::Load() (Dacpac時)
    │       or
    │   [Microsoft.SqlServer.Dac.BacPackage]::Load() (Bacpac時)
    │
    ├─ New-DbaDacOption (オプション生成)
    │      └─ PublishXmlからの読み込みも可能
    │
    ├─ New-Object Microsoft.SqlServer.Dac.DacServices
    │      │
    │      ├─ $dacServices.Script() (ScriptOnly時)
    │      │
    │      ├─ $dacServices.Publish() (Dacpac時)
    │      │
    │      └─ $dacServices.ImportBacpac() (Bacpac時)
    │
    └─ Out-File (スクリプト/レポート出力)
```

### データフロー図

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

DACPAC/BACPAC ──────▶ DacPackage/BacPackage.Load() ──┐
                                                      │
SqlInstance ─────────▶ Connect-DbaInstance ───────────┤
      or                                              │
ConnectionString ─────────────────────────────────────┼──▶ DacServices
                                                      │         │
PublishXml ──────────▶ New-DbaDacOption ──────────────┤         │
      or                                              │         ▼
DacOption ────────────────────────────────────────────┘    Publish/Import
                                                                │
                                                      ┌─────────┴─────────┐
                                                      ▼                   ▼
                                              PSCustomObject        データベース変更
                                                      │                   │
                                                      ▼                   ▼
                                              スクリプト/レポート   スキーマ/データ適用
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Publish-DbaDacPackage.ps1 | `public/Publish-DbaDacPackage.ps1` | ソース | メイン実装ファイル |
| Publish-DbaDacPackage.Tests.ps1 | `tests/Publish-DbaDacPackage.Tests.ps1` | テスト | 単体テスト |
| New-DbaDacOption.ps1 | `public/New-DbaDacOption.ps1` | ソース | デプロイオプション生成 |
| New-DbaDacProfile.ps1 | `public/New-DbaDacProfile.ps1` | ソース | パブリッシュプロファイル生成 |
| Export-DbaDacPackage.ps1 | `public/Export-DbaDacPackage.ps1` | ソース | DACPAC/BACPAC抽出 |
| New-DbaDacPackage.ps1 | `public/New-DbaDacPackage.ps1` | ソース | ソースからDACPAC生成 |
