# 画面設計書 80-パブリケーション管理

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおける「パブリケーション管理」機能の設計書です。SQL Server レプリケーションのパブリケーションの取得・作成・削除を行うコマンド群について記述します。

### 本画面の処理概要

本機能は、SQL Server レプリケーションにおけるパブリケーション（トランザクショナル、マージ、スナップショット）を管理する機能を提供します。パブリケーションは、レプリケートするデータセットとその構成を定義します。

**業務上の目的・背景**：SQL Server レプリケーション環境において、パブリケーションはどのデータをどのようにレプリケートするかを定義する中心的な構成要素です。本機能により、既存のパブリケーション構成の監査、新しいパブリケーションの作成、不要なパブリケーションの削除が可能です。これは、レプリケーショントポロジの管理、データ配布戦略の実装、トラブルシューティングに不可欠です。

**画面へのアクセス方法**：PowerShellコンソールから `Get-DbaReplPublication`、`New-DbaReplPublication`、`Remove-DbaReplPublication` コマンドを直接実行します。

**主要な操作・処理内容**：
1. `Get-DbaReplPublication`: パブリケーション情報の取得（トランザクショナル、マージ、スナップショット）
2. `New-DbaReplPublication`: パブリケーションの新規作成
3. `Remove-DbaReplPublication`: パブリケーションの削除

**画面遷移**：本機能はCLIコマンドのため画面遷移は存在しません。`Get-DbaReplPublication` の出力には Articles（アーティクル）と Subscriptions（サブスクリプション）が含まれ、関連情報に直接アクセスできます。

**権限による表示制御**：パブリケーション管理には sysadmin 権限または対象データベースの db_owner 権限が必要です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 446 | Get-DbaReplPublication | 主機能 | パブリケーションの取得 |
| 452 | New-DbaReplPublication | 主機能 | パブリケーションの作成 |
| 455 | Remove-DbaReplPublication | 主機能 | パブリケーションの削除 |

## 画面種別

一覧 / 管理（パブリケーションの一覧取得および管理操作）

## URL/ルーティング

PowerShellコマンド:
- `Get-DbaReplPublication`
- `New-DbaReplPublication`
- `Remove-DbaReplPublication`

## 入出力項目

### Get-DbaReplPublication 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | 代替認証情報 |
| Database | object[] | No | 対象データベース |
| Name | String | No | パブリケーション名でフィルタリング |
| Type (PublicationType) | string[] | No | パブリケーションタイプ（Transactional/Merge/Snapshot） |
| EnableException | switch | No | 例外を有効化 |

## 表示項目

### Get-DbaReplPublication 出力プロパティ

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | SQL Serverインスタンスのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | Server | SQL Serverオブジェクト |
| DatabaseName | string | パブリケーションが存在するデータベース名 |
| Name | string | パブリケーション名 |
| Type | string | パブリケーションタイプ（Transactional/Merge/Snapshot） |
| Articles | collection | パブリケーションに含まれるアーティクル |
| Subscriptions | collection | パブリケーションへのサブスクリプション |

## イベント仕様

### 1-Get-DbaReplPublication実行

1. Add-ReplicationLibrary でレプリケーションライブラリを読み込み
2. Connect-DbaInstance を使用してSQL Serverに接続（MinimumVersion 9）
3. アクセス可能なユーザーデータベースを取得
4. Database パラメータでフィルタリング
5. 各データベースについて:
   - ReplicationOptions をチェックしてパブリッシュされているか確認
   - Connect-ReplicationDB でレプリケーションDBに接続
   - TransPublications と MergePublications を取得
   - Type パラメータでフィルタリング
   - Name パラメータでフィルタリング
6. 各パブリケーションに対して:
   - Articles（TransArticles または MergeArticles）を取得
   - Subscriptions（TransSubscriptions または MergeSubscriptions）を取得
   - NoteProperty を追加
7. Select-DefaultView で出力を整形

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| Get-DbaReplPublication実行 | syspublications | SELECT | パブリケーション情報の取得 |
| Get-DbaReplPublication実行 | sysarticles | SELECT | アーティクル情報の取得 |
| Get-DbaReplPublication実行 | syssubscriptions | SELECT | サブスクリプション情報の取得 |
| New-DbaReplPublication実行 | syspublications | INSERT | パブリケーションの作成 |
| Remove-DbaReplPublication実行 | syspublications | DELETE | パブリケーションの削除 |

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

#### syspublications

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | pubid, name, status, repl_freq | パブリッシュされたDB | Get-DbaReplPublication |
| INSERT | name, status, repl_freq | New-DbaReplPublication | パブリケーション作成 |
| DELETE | pubid | Remove-DbaReplPublication | パブリケーション削除 |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|---------|
| MSG-001 | エラー | Failure | SQL Server接続失敗時 |
| MSG-002 | エラー | Unable to get databases for | データベース取得失敗時 |
| MSG-003 | エラー | Unable to get publications from | パブリケーション取得失敗時 |
| MSG-004 | 情報 | Skipping $($db.name). Database is not published. | パブリッシュされていないDB（Verbose） |

## 例外処理

| 例外種別 | 発生条件 | 処理内容 |
|---------|---------|---------|
| ConnectionError | SQL Serverへの接続失敗 | Stop-Function で処理を停止 |
| DatabaseNotPublished | データベースがパブリッシュされていない | スキップして続行 |
| MinimumVersion | SQL Server 2005 未満 | 接続時に自動検証、非対応バージョンはスキップ |

## 備考

- パブリケーションタイプ: Transactional（トランザクショナル）、Merge（マージ）、Snapshot（スナップショット）
- TransPublications と MergePublications の両方を取得して結合
- Type パラメータで特定のパブリケーションタイプのみにフィルタリング可能
- データベースの ReplicationOptions をチェックして、Published または MergePublished のみを処理
- Articles プロパティには TransArticles または MergeArticles が含まれる
- Subscriptions プロパティには TransSubscriptions または MergeSubscriptions が含まれる

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaReplPublication.ps1 | `public/Get-DbaReplPublication.ps1` | 出力プロパティの定義（行49-76） |

**読解のコツ**: Publication オブジェクトに Articles と Subscriptions の NoteProperty を追加している点に注目。Type によって TransArticles/MergeArticles が切り替わる。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaReplPublication.ps1 | `public/Get-DbaReplPublication.ps1` | param ブロック（行103-114）とデータベースループ処理（行138-180） |

**主要処理フロー**:
1. **行116**: Add-ReplicationLibrary でライブラリ読み込み
2. **行123**: Connect-DbaInstance による接続（MinimumVersion 9）
3. **行129-132**: データベース取得とフィルタリング
4. **行141-146**: ReplicationOptions チェック（Published または MergePublished）
5. **行149**: Connect-ReplicationDB 呼び出し
6. **行151**: TransPublications + MergePublications の結合
7. **行153-158**: Type, Name によるフィルタリング
8. **行162-168**: Articles, Subscriptions の取得（Type による分岐）
9. **行171-175**: NoteProperty の追加
10. **行177**: Select-DefaultView で出力整形

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

```
Get-DbaReplPublication
    |
    +-- Add-ReplicationLibrary (レプリケーションライブラリ読み込み)
    |
    +-- Test-FunctionInterrupt (キャンセルチェック)
    |
    +-- Connect-DbaInstance (SQL Server 接続)
    |       +-- MinimumVersion 9 チェック
    |
    +-- $server.Databases (データベース一覧取得)
    |       +-- IsAccessible チェック
    |       +-- IsSystemObject 除外
    |       +-- Database パラメータでフィルタリング
    |
    +-- [各データベース処理]
    |       +-- ReplicationOptions チェック
    |       |       +-- Published ビット
    |       |       +-- MergePublished ビット
    |       |
    |       +-- Connect-ReplicationDB (レプリケーションDB接続)
    |       |
    |       +-- TransPublications + MergePublications 取得
    |       |
    |       +-- [Type, Name フィルタリング]
    |       |
    |       +-- [各パブリケーション処理]
    |               +-- Articles 取得（TransArticles/MergeArticles）
    |               +-- Subscriptions 取得（Trans/MergeSubscriptions）
    |               +-- Add-Member (NoteProperty 追加)
    |
    +-- Select-DefaultView (出力整形)
```

### データフロー図

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

SqlInstance  ───+
                |
SqlCredential ──+──> Connect-DbaInstance ───> Server Object
                |
Database ───────+──> $server.Databases ─────> Database[]
                |    ReplicationOptions
                |    フィルタリング
                |
Type ───────────+──> Connect-ReplicationDB ──> ReplicationDB
Name ───────────+    |
                     +──> TransPublications ─+
                     |                       |──> Publication[]
                     +──> MergePublications ─+
                     |
                     +──> Type/Name フィルタリング

Publication[] ──+──> Articles 取得 ─────────+
                |    (Trans/MergeArticles)  |
                |                           |──> 拡張Publication
                +──> Subscriptions 取得 ────+
                     (Trans/MergeSubscriptions)

拡張Publication ────> Select-DefaultView ────> Pipeline Output
                      (DatabaseName, Name,
                       Type, Articles,
                       Subscriptions)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaReplPublication.ps1 | `public/Get-DbaReplPublication.ps1` | ソース | パブリケーション取得 |
| New-DbaReplPublication.ps1 | `public/New-DbaReplPublication.ps1` | ソース | パブリケーション作成 |
| Remove-DbaReplPublication.ps1 | `public/Remove-DbaReplPublication.ps1` | ソース | パブリケーション削除 |
| Get-DbaReplArticle.ps1 | `public/Get-DbaReplArticle.ps1` | ソース | アーティクル取得 |
| Get-DbaReplSubscription.ps1 | `public/Get-DbaReplSubscription.ps1` | ソース | サブスクリプション取得 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続処理 |
