# 機能設計書 269-Remove-DbaDbMailProfile

## 概要

本ドキュメントは、SQL ServerからDatabase Mailプロファイルを削除するRemove-DbaDbMailProfileコマンドレットの機能設計を記述する。

### 本機能の処理概要

Remove-DbaDbMailProfileは、指定されたSQL ServerインスタンスからDatabase Mailプロファイルを永続的に削除するPowerShellコマンドレットである。msdbデータベースからプロファイル構成を削除し、そのプロファイル経由でのメール送信を無効にする。セキュリティ強化のための未使用プロファイル削除、誤設定されたメール設定のクリーンアップなどに使用される。

**業務上の目的・背景**：Database Mailプロファイルは、長期運用により不要になったり、セキュリティ監査で削除が求められたりする。本コマンドは、廃止プロファイルの削除、セキュリティ強化のための未使用プロファイル整理、環境クリーンアップといった業務課題を解決する。パイプライン入力をサポートしており、Get-DbaDbMailProfileとOut-GridViewを組み合わせて対話的に削除対象を選択することも可能。

**機能の利用シーン**：
- 廃止されたメールプロファイルの削除
- セキュリティ強化のための未使用プロファイル削除
- 誤設定されたプロファイルのクリーンアップ
- 環境移行・統合時のプロファイル整理
- 一括削除（ExcludeProfile指定で特定プロファイルを保持）

**主要な処理内容**：
1. SqlInstanceパラメータ指定時はGet-DbaDbMailProfileでプロファイル取得
2. パイプライン入力（InputObject）の処理
3. 各プロファイルに対してShouldProcess確認
4. SMO Drop()メソッドでプロファイル削除
5. 削除結果（Status、IsRemoved）をパイプライン出力

**関連システム・外部連携**：SQL Server Management Objects（SMO）のMicrosoft.SqlServer.Management.Smo.Mail.MailProfileクラスのDrop()メソッドを使用してプロファイルを削除する。Get-DbaDbMailProfileコマンドと連携してパイプライン処理が可能。

**権限による制御**：Database Mailプロファイル削除には、sysadminサーバーロールまたは適切なmsdbデータベース権限が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 52 | データベースメール | 補助機能 | メールプロファイルの削除 |

## 機能種別

データ削除（DELETE）/ 構成設定

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | Yes（NonPipelineセット） | 接続先SQL Serverインスタンス | ParameterSetName: NonPipeline |
| SqlCredential | PSCredential | No | 代替認証用資格情報 | Windows/SQL認証対応 |
| Profile | string[] | No | 削除するプロファイル名 | 複数値対応、ワイルドカード対応 |
| ExcludeProfile | string[] | No | 削除から除外するプロファイル名 | 複数値対応、ワイルドカード対応 |
| InputObject | Microsoft.SqlServer.Management.Smo.Mail.MailProfile[] | Yes（Pipelineセット） | パイプライン入力用プロファイルオブジェクト | Get-DbaDbMailProfileからの入力 |
| EnableException | switch | No | 例外を直接スローするかどうか | - |

### 入力データソース

- SqlInstance + Profile: ユーザー指定（NonPipelineパラメータセット）
- InputObject: Get-DbaDbMailProfileからのパイプライン入力（Pipelineパラメータセット）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverホスト名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全修飾インスタンス名 |
| Name | string | 削除されたプロファイル名 |
| Status | string | 操作結果（"Dropped" or エラーメッセージ） |
| IsRemoved | bool | 削除成功の場合true、失敗の場合false |

### 出力先

パイプライン出力（PSCustomObject型）

## 処理フロー

### 処理シーケンス

```
1. begin ブロック
   └─ 空の配列を初期化

2. process ブロック
   └─ SqlInstance指定時: Get-DbaDbMailProfileでプロファイル取得
   └─ InputObject指定時: 配列に追加

3. end ブロック（コレクション変更エラー回避のため）
   └─ 各プロファイルに対して処理
   └─ ShouldProcess確認
   └─ Drop()メソッドでプロファイル削除
   └─ 結果オブジェクト作成・出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[begin: 配列初期化]
    B --> C[process: 入力処理]
    C --> D{SqlInstance指定?}
    D -->|Yes| E[Get-DbaDbMailProfile呼び出し]
    D -->|No| F[InputObjectを配列に追加]
    E --> G[配列に追加]
    F --> G
    G --> H[end: foreachループ]
    H --> I[ShouldProcess確認]
    I --> J{確認OK?}
    J -->|No| K[スキップ]
    J -->|Yes| L[出力オブジェクト初期化]
    L --> M[Drop実行]
    M --> N{成功?}
    N -->|Yes| O[Status = Dropped, IsRemoved = true]
    N -->|No| P[Stop-Function, Status = エラー, IsRemoved = false]
    O --> Q[結果出力]
    P --> Q
    Q --> R{次のプロファイル?}
    K --> R
    R -->|Yes| H
    R -->|No| S[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | パラメータセット | NonPipelineとPipelineは排他的 | 常時 |
| BR-002 | 除外フィルタ | ExcludeProfile指定時は該当プロファイルを削除対象から除外 | ExcludeProfileパラメータ指定時 |
| BR-003 | endブロック処理 | コレクション変更エラー回避のためendブロックで削除実行 | パイプライン入力時 |
| BR-004 | 確認プロンプト | ConfirmImpact: Highのため、デフォルトで確認プロンプト表示 | 常時 |

### 計算ロジック

特になし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| プロファイル削除 | msdb.dbo.sysmail_profile | DELETE | プロファイル情報の削除 |
| 関連付け削除 | msdb.dbo.sysmail_profileaccount | DELETE | プロファイル-アカウント関連の削除 |

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

#### msdb.dbo.sysmail_profile

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| DELETE | - | profile_id = 対象プロファイルID | SMO Drop()経由 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 接続エラー | SQL Serverに接続できない | 接続設定・資格情報を確認 |
| - | 削除エラー | プロファイル削除失敗 | 依存関係・権限を確認 |
| - | 使用中エラー | プロファイルがアクティブに使用されている | IsBusyProfile確認、使用停止後に再試行 |

### リトライ仕様

なし（エラー時はStatus/IsRemovedに結果を設定して続行）

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

SMO経由での操作のため、内部的にトランザクション管理される

## パフォーマンス要件

単一プロファイル削除は即時完了。複数プロファイルは順次処理。

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

- sysadmin権限または適切なmsdb権限が必要
- SupportsShouldProcess対応（WhatIf/Confirm）
- ConfirmImpact: High（デフォルトで確認プロンプト表示）
- -Confirm:$falseで確認をスキップ可能

## 備考

- Get-DbaDbMailProfileとOut-GridViewを組み合わせて対話的削除が可能
- Author: Mikey Bronowski (@MikeyBronowski)

---

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

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

### 推奨読解順序

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

出力されるPSCustomObjectの構造と削除プロセスを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Remove-DbaDbMailProfile.ps1 | `public/Remove-DbaDbMailProfile.ps1` | .OUTPUTSセクション（46-58行目）で出力プロパティを確認 |
| 1-2 | Remove-DbaDbMailProfile.ps1 | `public/Remove-DbaDbMailProfile.ps1` | パラメータ定義（85-99行目）でパラメータセットを確認 |

**読解のコツ**: NonPipelineとPipelineの2つのパラメータセットがあり、排他的に使用される点に注目。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Remove-DbaDbMailProfile.ps1 | `public/Remove-DbaDbMailProfile.ps1` | begin/process/endブロック構造（101-141行目） |

**主要処理フロー**:
1. **101-103行目**: beginブロックで空配列初期化
2. **105-114行目**: processブロックで入力処理（Get-DbaDbMailProfileまたはInputObject追加）
3. **116-141行目**: endブロックで実際の削除処理

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Remove-DbaDbMailProfile.ps1 | `public/Remove-DbaDbMailProfile.ps1` | endブロックの削除ロジック（118-140行目） |

**主要処理フロー**:
- **117行目**: コメント「We have to delete in the end block to prevent...」
- **118行目**: foreachで各プロファイルをループ
- **119行目**: ShouldProcess確認（対象インスタンスとプロファイル名を表示）
- **120-127行目**: 出力オブジェクト初期化（Status = null, IsRemoved = false）
- **129行目**: Drop()メソッドでプロファイル削除
- **130-131行目**: 成功時にStatus = "Dropped", IsRemoved = true
- **132-135行目**: 失敗時にStop-FunctionとGet-ErrorMessage
- **137行目**: 結果オブジェクト出力

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

```
Remove-DbaDbMailProfile
    │
    ├─ begin
    │      └─ 空配列初期化
    │
    ├─ process
    │      ├─ Get-DbaDbMailProfile（SqlInstance指定時）
    │      │      └─ Profile/ExcludeProfileフィルタ
    │      └─ InputObject追加（パイプライン時）
    │
    └─ end
           ├─ foreachループ
           │      ├─ ShouldProcess確認
           │      ├─ 出力オブジェクト初期化
           │      ├─ Drop()
           │      └─ 結果設定
           └─ 結果出力
```

### データフロー図

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

SqlInstance ────┐
                ├──▶ Get-DbaDbMailProfile
Profile ───────▶│         │
                │         ▼
ExcludeProfile ─▶│    配列に蓄積
                │
InputObject ────────────▶ │
                          │
                          ▼
                     [end ブロック]
                          │
                          ▼
                   ShouldProcess確認
                          │
                          ▼
                      Drop()
                          │
                          ▼
                     [PSCustomObject]
                     - ComputerName
                     - InstanceName
                     - SqlInstance
                     - Name
                     - Status
                     - IsRemoved
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Remove-DbaDbMailProfile.ps1 | `public/Remove-DbaDbMailProfile.ps1` | ソース | メイン処理ロジック |
| Get-DbaDbMailProfile.ps1 | `public/Get-DbaDbMailProfile.ps1` | ソース | プロファイル取得（フィルタ処理） |
