# 機能設計書 612-Remove-DbaDbCertificate

## 概要

本ドキュメントは、SQL Serverデータベースから証明書を削除するdbatools PowerShell関数 `Remove-DbaDbCertificate` の機能設計書である。

### 本機能の処理概要

**業務上の目的・背景**：データベース証明書はSQL Serverの暗号化インフラストラクチャの重要なコンポーネントであり、透過的データ暗号化（TDE）、Always Encrypted、データベースミラーリングなどの機能で使用される。証明書のローテーション作業、セキュリティクリーンアップ、暗号化機能の廃止時に、不要な証明書を安全かつ効率的に削除する必要がある。本機能はこれらの運用タスクを支援するPowerShellコマンドを提供する。

**機能の利用シーン**：
- 証明書ローテーション後の古い証明書の削除
- TDEや Always Encryptedの廃止時のセキュリティオブジェクトクリーンアップ
- 有効期限切れ証明書の削除
- データベース移行前のセキュリティ整理

**主要な処理内容**：
1. SqlInstanceパラメータが指定された場合、Get-DbaDbCertificateを呼び出して対象の証明書を取得
2. パイプライン入力またはGet-DbaDbCertificateから取得した証明書オブジェクトを処理
3. 各証明書に対してDROP CERTIFICATEコマンドを実行
4. 削除結果をPSCustomObjectとして出力

**関連システム・外部連携**：SQL Server Management Objects (SMO) を使用してSQL Serverインスタンスと連携する。Invoke-DbaQueryを使用してT-SQLコマンドを実行する。

**権限による制御**：証明書の削除には、対象データベースでのCONTROL権限または証明書に対するALTER ANY CERTIFICATE権限が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 33 | 証明書管理 | 主機能 | データベース証明書の削除 |

## 機能種別

データベース操作（DELETE）- セキュリティオブジェクト管理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | No | 対象のSQL Serverインスタンス | 有効なインスタンス名 |
| SqlCredential | PSCredential | No | 代替認証情報 | 有効な資格情報オブジェクト |
| Database | string[] | No | 対象のデータベース名 | 有効なデータベース名 |
| Certificate | string[] | No | 削除する証明書の名前 | - |
| InputObject | Microsoft.SqlServer.Management.Smo.Certificate[] | No | パイプライン入力用の証明書オブジェクト | 有効なCertificateオブジェクト |
| EnableException | switch | No | 例外処理の有効化 | - |
| WhatIf | switch | No | 実行せずに処理内容を表示 | - |
| Confirm | switch | No | 実行前に確認プロンプトを表示 | - |

### 入力データソース

- SqlInstanceパラメータ: コマンドライン引数
- InputObject: Get-DbaDbCertificateからのパイプライン入力
- SqlCredential: Get-Credentialコマンドレットまたは事前定義の資格情報

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverインスタンスのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| Database | string | 証明書が削除されたデータベース名 |
| Certificate | string | 削除された証明書の名前 |
| Status | string | 削除結果（"Success"） |

### 出力先

PowerShellパイプライン - 呼び出し元のスクリプトまたはコンソールに出力

## 処理フロー

### 処理シーケンス

```
1. 入力パラメータの検証
   └─ SqlInstanceが指定された場合、Get-DbaDbCertificateを呼び出し
2. 証明書オブジェクトのループ処理
   └─ 各証明書に対して以下を実行
3. ShouldProcess確認
   └─ WhatIfまたはConfirmの処理
4. DROP CERTIFICATEコマンド実行
   └─ Invoke-DbaQueryを使用してT-SQLを実行
5. 結果オブジェクトの出力
   └─ PSCustomObjectとして結果を出力
6. エラー処理
   └─ 失敗時はStop-Functionで処理を継続
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{SqlInstance指定?}
    B -->|Yes| C[Get-DbaDbCertificateで取得]
    B -->|No| D[InputObjectを使用]
    C --> E[InputObjectに追加]
    D --> F[証明書ループ開始]
    E --> F
    F --> G{証明書が残っている?}
    G -->|No| H[終了]
    G -->|Yes| I{ShouldProcess?}
    I -->|No| J[次の証明書へ]
    I -->|Yes| K[DROP CERTIFICATE実行]
    K --> L{成功?}
    L -->|Yes| M[結果オブジェクト出力]
    L -->|No| N[Stop-Function呼び出し]
    M --> J
    N --> J
    J --> G
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | パイプライン優先 | InputObjectとSqlInstanceの両方が指定された場合、両方の結果が処理される | 両方指定時 |
| BR-002 | 確認プロンプト | ConfirmImpactがHighのため、デフォルトで確認プロンプトが表示される | Confirm:$false未指定時 |
| BR-003 | 依存オブジェクト確認 | 証明書が他のオブジェクト（暗号化キーなど）に使用されている場合、削除に失敗する | 依存関係存在時 |

### 計算ロジック

特になし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 証明書削除 | sys.certificates | DELETE | 指定された証明書を削除 |

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

#### sys.certificates

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| DELETE | - | DROP CERTIFICATE [証明書名] | SMOではなくT-SQLで直接削除 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 証明書削除失敗 | 証明書が使用中または権限不足 | Stop-Functionで警告を出力し、次の証明書の処理を継続 |
| - | 接続エラー | SQL Serverインスタンスに接続できない | Get-DbaDbCertificate内でエラー処理 |

### リトライ仕様

リトライ機能なし - エラー発生時は次の証明書の処理を継続

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

個々のDROP CERTIFICATEコマンドは自動コミットで実行される。複数証明書の削除はそれぞれ独立したトランザクションで処理される。

## パフォーマンス要件

特に定義されていない。大量の証明書を削除する場合は、パイプラインを使用した一括処理を推奨。

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

- 証明書の削除には適切なデータベース権限が必要
- Windows認証、SQL Server認証、Active Directory認証をサポート
- MFAサポートにはConnect-DbaInstanceを使用
- 削除操作は監査ログに記録される（SQL Serverの監査設定に依存）
- 証明書削除前にバックアップを取得することを強く推奨

## 備考

- SMOの.netメソッドではエラーハンドリングが正しく動作しないため、Invoke-DbaQueryを使用してT-SQLを直接実行している
- パイプライン入力のサポートにより、Get-DbaDbCertificateでフィルタリングした結果を直接削除可能
- 証明書が暗号化キーで使用中の場合、先にキーを削除または変更する必要がある

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Certificate (SMO) | Microsoft.SqlServer.Management.Smo | SQL Server証明書のSMOオブジェクト構造を理解する |

**読解のコツ**: SMOのCertificateオブジェクトは、Parentプロパティでデータベースオブジェクトを参照し、そのParentでサーバーオブジェクトにアクセスできる。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Remove-DbaDbCertificate.ps1 | `public/Remove-DbaDbCertificate.ps1` | メイン関数の入口とパラメータ定義を確認 |

**主要処理フロー**:
1. **77-86行目**: パラメータブロック定義 - CmdletBinding属性でShouldProcess、ConfirmImpact=Highを設定
2. **88-90行目**: SqlInstance指定時にGet-DbaDbCertificateを呼び出し
3. **91-93行目**: 証明書オブジェクトからデータベースとサーバー情報を取得
4. **95行目**: ShouldProcess確認
5. **97-99行目**: Invoke-DbaQueryでDROP CERTIFICATEを実行
6. **100-108行目**: 成功時に結果オブジェクトを出力
7. **109-111行目**: エラー時にStop-Functionで処理を継続

#### Step 3: 依存関数を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaDbCertificate.ps1 | `public/Get-DbaDbCertificate.ps1` | 証明書オブジェクトの取得方法を理解 |
| 3-2 | Invoke-DbaQuery.ps1 | `public/Invoke-DbaQuery.ps1` | T-SQLクエリの実行方法を理解 |

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

```
Remove-DbaDbCertificate
    │
    ├─ Get-DbaDbCertificate (SqlInstance指定時)
    │      └─ Connect-DbaInstance
    │             └─ SMO Server接続
    │
    ├─ ShouldProcess (確認処理)
    │
    └─ Invoke-DbaQuery
           └─ DROP CERTIFICATE実行
```

### データフロー図

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

SqlInstance     ───┬──▶ Get-DbaDbCertificate ───┐
SqlCredential   ───┤                             │
Certificate     ───┤                             │
Database        ───┘                             │
                                                 ▼
InputObject     ─────────────────────────────▶ foreach loop
                                                 │
                                                 ▼
                                          Invoke-DbaQuery
                                        (DROP CERTIFICATE)
                                                 │
                                                 ▼
                                          [PSCustomObject] ───▶ パイプライン出力
                                          ComputerName
                                          InstanceName
                                          SqlInstance
                                          Database
                                          Certificate
                                          Status
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Remove-DbaDbCertificate.ps1 | `public/Remove-DbaDbCertificate.ps1` | ソース | メイン関数 |
| Get-DbaDbCertificate.ps1 | `public/Get-DbaDbCertificate.ps1` | ソース | 証明書取得関数 |
| Invoke-DbaQuery.ps1 | `public/Invoke-DbaQuery.ps1` | ソース | クエリ実行関数 |
| Remove-DbaDbCertificate.Tests.ps1 | `tests/Remove-DbaDbCertificate.Tests.ps1` | テスト | 単体テスト |
