# 機能設計書 355-Remove-DbaDbLogShipping

## 概要

本ドキュメントは、SQL Serverログシッピング構成を解除し、関連するジョブや監視設定を削除する `Remove-DbaDbLogShipping` コマンドの機能設計書である。

### 本機能の処理概要

本機能は、プライマリとセカンダリの両インスタンスからログシッピング構成を完全に削除する。msdbの関連テーブルからの削除、SQL Agentジョブの削除、およびオプションでセカンダリデータベース自体の削除を行う。

**業務上の目的・背景**：ログシッピング構成の解除は、DRソリューションの変更、サーバー統合、ログシッピングからAlways On可用性グループへの移行など様々なシナリオで必要となる。手動での解除は複数のストアドプロシージャの実行を要し、プライマリとセカンダリの両方で作業が必要。本機能により、これらの解除作業を自動化し、残存オブジェクトのない完全なクリーンアップを実現する。

**機能の利用シーン**：
- DRソリューションの変更（ログシッピング→Always On）
- ログシッピング環境のクリーンアップ
- テスト環境のログシッピング解除
- サーバー廃止に伴う構成解除

**主要な処理内容**：
1. プライマリサーバーへの接続
2. ログシッピング構成情報の取得（セカンダリサーバー自動検出）
3. sp_delete_log_shipping_primary_secondary の実行
4. sp_delete_log_shipping_primary_database の実行
5. sp_delete_log_shipping_secondary_database の実行
6. オプション：セカンダリデータベースの削除

**関連システム・外部連携**：msdbログシッピングストアドプロシージャ、Remove-DbaDatabase

**権限による制御**：sysadmin権限が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| N/A | PowerShellコンソール | 主画面 | コマンド実行および結果表示 |

## 機能種別

システム構成解除 / ログシッピング削除

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| PrimarySqlInstance | DbaInstanceParameter | Yes | プライマリSQL Serverインスタンス | - |
| SecondarySqlInstance | DbaInstanceParameter | No | セカンダリSQL Serverインスタンス（自動検出可能） | - |
| PrimarySqlCredential | PSCredential | No | プライマリ認証情報 | - |
| SecondarySqlCredential | PSCredential | No | セカンダリ認証情報 | - |
| Database | Object[] | Yes | 削除対象データベース名 | パイプライン入力可能 |
| RemoveSecondaryDatabase | Switch | No | セカンダリDBも削除 | - |
| EnableException | Switch | No | 例外制御 | - |
| WhatIf | Switch | No | 実行シミュレーション | - |
| Confirm | Switch | No | 実行確認 | - |

### 入力データソース

- msdb.dbo.log_shipping_primary_databases
- msdb.dbo.log_shipping_primary_secondaries

## 出力仕様

### 出力データ

なし（Void）

### 出力先

構成変更のみ実行。出力オブジェクトなし。

## 処理フロー

### 処理シーケンス

```
1. プライマリサーバー接続
   └─ Connect-DbaInstance

2. データベースループ開始
   └─ 各データベースに対して以下を実行

3. データベース存在確認
   └─ プライマリサーバー上のDB存在チェック

4. ログシッピング構成情報取得
   ├─ log_shipping_primary_databases から primary_id 取得
   └─ log_shipping_primary_secondaries から secondary_server, secondary_database 取得

5. セカンダリサーバー決定
   ├─ パラメータ指定がある場合はそれを使用
   └─ 未指定の場合は構成情報から自動検出

6. セカンダリサーバー接続
   └─ Connect-DbaInstance

7. プライマリ-セカンダリ関連削除
   └─ sp_delete_log_shipping_primary_secondary 実行

8. プライマリ構成削除
   └─ sp_delete_log_shipping_primary_database 実行

9. セカンダリ構成削除
   └─ sp_delete_log_shipping_secondary_database 実行

10. セカンダリDB削除（オプション）
    └─ -RemoveSecondaryDatabase 指定時のみ Remove-DbaDatabase 実行
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[プライマリサーバー接続]
    B --> C{接続成功?}
    C -->|No| D[エラー: 接続失敗]
    C -->|Yes| E[データベースループ開始]
    E --> F{DB存在?}
    F -->|No| G[エラー: DB未存在]
    F -->|Yes| H[ログシッピング構成取得]
    H --> I{構成あり?}
    I -->|No| J[エラー: 構成未存在]
    I -->|Yes| K{セカンダリ構成あり?}
    K -->|No| L[プライマリ構成のみ削除]
    K -->|Yes| M[セカンダリサーバー接続]
    M --> N[sp_delete_log_shipping_primary_secondary]
    N --> O[sp_delete_log_shipping_primary_database]
    L --> O
    O --> P{セカンダリ構成あり?}
    P -->|No| Q{次のDB?}
    P -->|Yes| R[sp_delete_log_shipping_secondary_database]
    R --> S{-RemoveSecondaryDatabase?}
    S -->|No| Q
    S -->|Yes| T[Remove-DbaDatabase]
    T --> Q
    Q -->|Yes| E
    Q -->|No| U[終了]
    D --> U
    G --> Q
    J --> Q
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | セカンダリ自動検出 | SecondarySqlInstance未指定時は構成情報から自動検出 | SecondarySqlInstance未指定時 |
| BR-002 | 不完全構成対応 | セカンダリ構成がない場合もプライマリ構成のみ削除可能 | LEFT JOINで結合 |
| BR-003 | DB削除オプション | RemoveSecondaryDatabase指定時のみセカンダリDB削除 | -RemoveSecondaryDatabase指定時 |

### 計算ロジック

特になし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 構成取得 | msdb.dbo.log_shipping_primary_databases | SELECT | プライマリ構成取得 |
| 構成取得 | msdb.dbo.log_shipping_primary_secondaries | SELECT | セカンダリ関連取得 |
| 削除 | msdb.dbo.log_shipping_* | DELETE (SP経由) | ログシッピング構成削除 |
| 削除 | 対象DB | DROP DATABASE | セカンダリDB削除（オプション） |

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

#### msdb ストアドプロシージャ

| 操作 | プロシージャ名 | 用途 |
|-----|----------------|------|
| EXEC | sp_delete_log_shipping_primary_secondary | プライマリ-セカンダリ関連削除 |
| EXEC | sp_delete_log_shipping_primary_database | プライマリ構成削除 |
| EXEC | sp_delete_log_shipping_secondary_database | セカンダリ構成削除 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| ConnectionError | 接続エラー | インスタンス接続失敗 | Stop-Function、return |
| DatabaseNotFound | 検証エラー | 指定DBが存在しない | Stop-Function、continue |
| NoConfiguration | 検証エラー | ログシッピング未構成 | Stop-Function、continue |

### リトライ仕様

リトライ処理なし。

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

各ストアドプロシージャは個別実行。部分的な削除が発生する可能性あり。

## パフォーマンス要件

- データベース数に比例した処理時間
- セカンダリDB削除時はDBサイズに依存

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

- sysadmin権限が必要
- ShouldProcess対応（WhatIf/Confirm）

## 備考

- 不完全な構成（セカンダリ設定が途中で失敗した場合など）の削除にも対応

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Remove-DbaDbLogShipping.ps1 | `public/Remove-DbaDbLogShipping.ps1` | 構成取得クエリ（134-140行目）でテーブル構造確認 |

**読解のコツ**: LEFT JOINで不完全構成にも対応している点に注意。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Remove-DbaDbLogShipping.ps1 | `public/Remove-DbaDbLogShipping.ps1` | 関数全体の処理フロー |

**主要処理フロー**:
1. **95-108行目**: パラメータ定義
2. **110-121行目**: プライマリサーバー接続
3. **134-140行目**: ログシッピング構成取得クエリ
4. **153-186行目**: セカンダリ構成がある場合の処理
5. **188-198行目**: プライマリ構成削除
6. **200-225行目**: セカンダリ構成削除とDB削除

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

```
Remove-DbaDbLogShipping
    │
    ├─ Connect-DbaInstance (Primary)
    │
    ├─ Invoke-DbaQuery (構成取得)
    │
    ├─ Connect-DbaInstance (Secondary)
    │
    ├─ Invoke-DbaQuery
    │      ├─ sp_delete_log_shipping_primary_secondary
    │      ├─ sp_delete_log_shipping_primary_database
    │      └─ sp_delete_log_shipping_secondary_database
    │
    └─ Remove-DbaDatabase (オプション)
```

### データフロー図

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

PrimarySqlInstance ───▶ Connect-DbaInstance
Database                     │
                            ▼
                      構成情報取得
                      (msdb参照)
                            │
                            ▼
                      セカンダリサーバー決定
                            │
                            ▼
                      sp_delete系実行 ───▶ 構成削除
                            │
                            ▼
                      Remove-DbaDatabase ───▶ DB削除(オプション)
                      (オプション)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Remove-DbaDbLogShipping.ps1 | `public/Remove-DbaDbLogShipping.ps1` | ソース | メイン関数 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続 |
| Invoke-DbaQuery.ps1 | `public/Invoke-DbaQuery.ps1` | ソース | クエリ実行 |
| Remove-DbaDatabase.ps1 | `public/Remove-DbaDatabase.ps1` | ソース | DB削除 |
