# 機能設計書 455-Remove-DbaReplPublication

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおける`Remove-DbaReplPublication`関数の機能設計を定義する。この関数はSQL Serverレプリケーションパブリケーションを削除し、関連するエージェントジョブの停止とデータベースのパブリッシング無効化を行う。

### 本機能の処理概要

**業務上の目的・背景**：レプリケーション環境の解体やパブリケーション構成の再作成時に、既存のパブリケーションを削除する必要がある。本関数は、パブリケーションの削除に加え、関連するLog Reader Agentジョブの停止や、データベースのパブリッシング設定の無効化まで自動的に行い、クリーンな状態への復帰を支援する。

**機能の利用シーン**：
- レプリケーション環境の完全解体時
- パブリケーション構成の再構築時
- 不要になったパブリケーションのクリーンアップ時
- CI/CD パイプラインでのテスト環境リセット時

**主要な処理内容**：
1. 対象パブリケーションの特定（パラメータまたはパイプライン入力）
2. パブリケーションタイプ別の削除処理
3. REPL-LogReaderカテゴリのエージェントジョブ停止
4. パブリケーションのRemove()メソッド呼び出し
5. 同タイプのパブリケーションが他になければ、パブリッシング無効化
6. 削除結果オブジェクトの出力

**関連システム・外部連携**：SQL Server Replication Management Objects (RMO)、SQL Server Agent

**権限による制御**：sysadminまたはdb_owner権限、およびパブリケーション管理者権限が必要

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| N/A | SQL Server Management Studio - レプリケーションフォルダ | 参照画面 | パブリケーション削除操作に相当 |

## 機能種別

CRUD操作（Delete） / レプリケーション構成解体

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | No* | SQL Serverインスタンス | InputObjectと排他 |
| SqlCredential | PSCredential | No | SQL Server認証用資格情報 | 有効な認証情報 |
| Database | String | No* | パブリケーションデータベース | InputObjectと排他 |
| Name | String | No* | パブリケーション名 | InputObjectと排他 |
| InputObject | PSObject[] | No* | Get-DbaReplPublicationからのパイプライン入力 | 有効なパブリケーションオブジェクト |
| EnableException | Switch | No | 例外を有効化 | なし |

*SqlInstance または InputObject のいずれかが必須

### 入力データソース

- パラメータ入力
- Get-DbaReplPublicationからのパイプライン入力

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | String | SQL Serverホストのコンピュータ名 |
| InstanceName | String | SQL Serverインスタンス名 |
| SqlInstance | String | フルSQL Serverインスタンス名 |
| Database | String | データベース名 |
| Name | String | 削除されたパブリケーション名 |
| Type | String | パブリケーションタイプ |
| Status | String | 削除結果（"Removed"またはエラーメッセージ） |
| IsRemoved | Boolean | 削除成功可否 |

### 出力先

パイプラインに削除結果オブジェクトを出力

## 処理フロー

### 処理シーケンス

```
1. 入力検証
   └─ SqlInstanceまたはInputObjectの存在確認
2. パブリケーション情報の取得
   ├─ InputObject指定時: そのまま使用
   └─ パラメータ指定時: Get-DbaReplPublicationで取得
3. 各パブリケーションに対する削除処理（endブロック）
   ├─ ShouldProcess確認
   ├─ パブリケーションタイプ判定
   ├─ Transactional/Snapshot の場合
   │   ├─ IsExistingObject確認
   │   ├─ REPL-LogReaderジョブ停止
   │   ├─ Remove()実行
   │   └─ 他にTransactional/Snapshotパブリケーションがなければ
   │       EnabledTransPublishing = false
   └─ Merge の場合
       ├─ IsExistingObject確認
       ├─ REPL-LogReaderジョブ停止
       ├─ Remove()実行
       └─ 他にMergeパブリケーションがなければ
           EnabledMergePublishing = false
4. 結果オブジェクトの出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{SqlInstance or InputObject?}
    B -->|どちらもなし| C[エラー終了]
    B -->|あり| D{InputObject指定?}
    D -->|Yes| E[InputObjectを使用]
    D -->|No| F[Get-DbaReplPublication]
    E --> G[endブロック: foreach publication]
    F --> G
    G --> H[ShouldProcess確認]
    H -->|No| R[スキップ]
    H -->|Yes| I{Type判定}
    I -->|Transactional/Snapshot| J{IsExistingObject?}
    I -->|Merge| K{IsExistingObject?}
    J -->|No| L[警告出力]
    J -->|Yes| M[REPL-LogReaderジョブ停止]
    K -->|No| N[警告出力]
    K -->|Yes| O[REPL-LogReaderジョブ停止]
    M --> P[Remove実行]
    O --> Q[Remove実行]
    P --> S{同タイプPub残存?}
    Q --> T{MergePub残存?}
    S -->|No| U[EnabledTransPublishing=false]
    S -->|Yes| V[結果出力]
    T -->|No| W[EnabledMergePublishing=false]
    T -->|Yes| X[結果出力]
    U --> V
    W --> X
    L --> Y[次のパブリケーション]
    N --> Y
    V --> Y
    X --> Y
    R --> Y
    Y --> G
    G -->|完了| Z[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | Log Readerジョブ停止 | パブリケーション削除前にREPL-LogReaderジョブを停止 | 常時適用 |
| BR-002 | パブリッシング自動無効化 | 同タイプの他のパブリケーションがなければ、パブリッシング設定を無効化 | 最後のパブリケーション削除時 |
| BR-003 | endブロック実行 | 削除処理はendブロックで実行し、パイプライン入力時のコレクション変更エラーを回避 | 常時適用 |
| BR-004 | ConfirmImpact High | 削除操作のため、確認プロンプトを表示 | -Confirmが有効な場合 |

### 計算ロジック

特になし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| パブリケーション削除 | syspublications | DELETE | パブリケーション情報の削除 |
| パブリッシング無効化 | sysdatabases | UPDATE | レプリケーションフラグの変更 |

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

#### syspublications (publication database)

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| DELETE | pubid | 対象パブリケーションID | パブリケーション削除 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| N/A | 入力検証エラー | SqlInstanceとInputObject両方未指定 | いずれかを指定 |
| N/A | パブリケーション不存在 | IsExistingObject = false | 正しいパブリケーション名を指定 |
| N/A | 削除失敗 | Remove()メソッドでエラー | 権限確認、依存関係確認 |
| N/A | データベース不存在 | LoadProperties() = false | データベース名を確認 |

### リトライ仕様

本関数にリトライ機能は実装されていない。

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

Remove()とパブリッシング無効化は個別トランザクションで実行。

## パフォーマンス要件

パブリケーション削除は通常数秒で完了。

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

- sysadminまたはdb_owner権限が必要
- SqlCredentialはSecureStringとして処理
- ConfirmImpact = 'High'により、誤操作を防止

## 備考

- パブリケーション削除後、サブスクリプションデータベースのデータは残存
- Log Reader Agentジョブの停止にGet-DbaAgentJob / Stop-DbaAgentJobを使用
- 191行目と191行目にプロパティ名の誤りがある可能性（EnabledTransPublishingチェック後にEnableMergePublishingを設定）

---

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

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

### 推奨読解順序

#### Step 1: 関数構造とパラメータを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Remove-DbaReplPublication.ps1 | `public/Remove-DbaReplPublication.ps1` | param()ブロック（76-85行目） |

**読解のコツ**: `ConfirmImpact = 'High'`により、-Confirmなしでも確認プロンプトが表示される。

#### Step 2: 入力処理（processブロック）を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Remove-DbaReplPublication.ps1 | `public/Remove-DbaReplPublication.ps1` | processブロック（90-105行目） |

**主要処理フロー**:
1. **91-94行目**: SqlInstanceとInputObject両方未指定時のエラー
2. **96-97行目**: InputObject指定時は配列に追加
3. **99-103行目**: パラメータ指定時はGet-DbaReplPublicationで取得

#### Step 3: Transactional/Snapshot削除処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Remove-DbaReplPublication.ps1 | `public/Remove-DbaReplPublication.ps1` | Transactional処理（122-159行目） |

**主要処理フロー**:
- **124行目**: IsExistingObject確認
- **127-128行目**: REPL-LogReaderジョブ停止
- **130行目**: Remove()実行
- **143-154行目**: 他にTransactional/Snapshotパブリケーションがなければパブリッシング無効化

#### Step 4: Merge削除処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Remove-DbaReplPublication.ps1 | `public/Remove-DbaReplPublication.ps1` | Merge処理（160-199行目） |

**主要処理フロー**:
- **162行目**: IsExistingObject確認
- **164-165行目**: REPL-LogReaderジョブ停止
- **167行目**: Remove()実行
- **182-195行目**: 他にMergeパブリケーションがなければパブリッシング無効化

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

```
Remove-DbaReplPublication
    │
    ├─ [begin] Add-ReplicationLibrary
    │
    ├─ [process] Get-DbaReplPublication (パラメータ指定時)
    │
    └─ [end] foreach (publication)
           │
           ├─ Get-DbaAgentJob
           │      └─ -Category REPL-LogReader
           │
           ├─ Stop-DbaAgentJob
           │      └─ Log Readerジョブ停止
           │
           ├─ [RMO] Publication.Remove()
           │
           ├─ Get-DbaReplPublication
           │      └─ 同タイプパブリケーション残存確認
           │
           └─ [RMO] ReplicationDatabase
                  ├─ LoadProperties()
                  ├─ EnabledTransPublishing = false
                  └─ EnabledMergePublishing = false
```

### データフロー図

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

SqlInstance/InputObject ────▶ 入力検証 ─────────────────────────────▶ エラー（両方なし）
                                   │
InputObject ────────────────▶ 配列に追加 ─────────────────────────────┐
                                   │                                  │
パラメータ ──────────────────▶ Get-DbaReplPublication ───────────────┤
                                   │                                  │
                             foreach (publication) ◀──────────────────┘
                                   │
                             Get-DbaAgentJob ─────────────────────────▶ REPL-LogReader検索
                                   │
                             Stop-DbaAgentJob ────────────────────────▶ ジョブ停止
                                   │
                             Remove() ────────────────────────────────▶ パブリケーション削除
                                   │
                             Get-DbaReplPublication ──────────────────▶ 残存確認
                                   │
                             EnabledXxxPublishing = false ────────────▶ パブリッシング無効化
                                   │
                                   └──────────────────────────────────▶ PSCustomObject
                                                                        (Status, IsRemoved)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Remove-DbaReplPublication.ps1 | `public/Remove-DbaReplPublication.ps1` | ソース | メイン関数定義 |
| Get-DbaReplPublication.ps1 | `public/Get-DbaReplPublication.ps1` | ソース | パブリケーション情報取得 |
| Get-DbaAgentJob.ps1 | `public/Get-DbaAgentJob.ps1` | ソース | エージェントジョブ取得 |
| Stop-DbaAgentJob.ps1 | `public/Stop-DbaAgentJob.ps1` | ソース | エージェントジョブ停止 |
| New-DbaReplPublication.ps1 | `public/New-DbaReplPublication.ps1` | ソース | 対となるパブリケーション作成機能 |
