# 機能設計書 469-Remove-DbaRgResourcePool

## 概要

本ドキュメントは、SQL Server Resource Governorからリソースプールを削除するRemove-DbaRgResourcePool機能の設計を記述する。

### 本機能の処理概要

Remove-DbaRgResourcePoolは、SQL Server Resource Governorからユーザー定義のリソースプールを削除する機能である。削除されたプールに割り当てられていたメモリ、CPU、I/Oリソースは、他のワークロードへの再配分のために解放される。

**業務上の目的・背景**：リソースプールは、データベースワークロードに対する物理リソースの境界（メモリ、CPU、IO）を定義する。使用されなくなったプールの削除、ワークロード管理の統合、またはリソース割り当て戦略の再構成を行う際に、この機能が必要となる。未使用のプールを削除することで、Resource Governor構成をクリーンに保ち、リソースの断片化を防止できる。

**機能の利用シーン**：
- 不要になったリソースプールのクリーンアップ
- ワークロード管理ポリシーの再編成
- テスト環境のリソースプール削除
- Resource Governor構成の簡素化

**主要な処理内容**：
1. 削除対象のリソースプールを特定（SqlInstanceとResourcePoolまたはInputObject）
2. プールタイプ（Internal/External）を自動検出または指定
3. SMOのDrop()メソッドでプールを削除
4. Resource Governorを再構成して変更を適用

**関連システム・外部連携**：Get-DbaRgResourcePoolからパイプライン入力を受け取ることができる。SMOを使用してResource Governorを操作する。

**権限による制御**：CONTROL SERVER権限またはsysadminロールが必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 113 | リソースプール | 主機能 | リソースプールの削除 |

## 機能種別

DELETE / 削除

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | No | 対象のSQL Serverインスタンス | ValueFromPipeline |
| SqlCredential | PSCredential | No | 代替認証情報 | - |
| ResourcePool | String[] | No | 削除するリソースプール名 | InputObject未指定時は必須 |
| Type | String | No | プールタイプ | ValidateSet: Internal, External。デフォルト: Internal |
| SkipReconfigure | switch | No | 再構成をスキップ | - |
| InputObject | Object[] | No | 削除するResourcePoolオブジェクト | ValueFromPipeline |
| EnableException | switch | No | 例外を直接スローするかどうか | - |

### 入力データソース

- パラメータ入力（SqlInstance、ResourcePool、Type）
- パイプライン入力（SqlInstance、ResourcePoolオブジェクト）

## 出力仕様

### 出力データ

この機能は出力オブジェクトを返さない。削除操作と再構成のみを実行する。

### 出力先

該当なし

## 処理フロー

### 処理シーケンス

```
1. パラメータ検証
   ├─ InputObjectとResourcePoolの両方が未指定: エラー
   └─ InputObjectとSqlInstanceの両方が未指定: エラー
2. InputObject指定時、Type未指定の場合
   └─ オブジェクト型からTypeを自動検出
3. SqlInstance指定時、ResourcePoolでプールを取得
   └─ InputObjectに追加
4. 各ResourcePoolオブジェクトに対して繰り返し処理
5. ShouldProcessで確認
6. Drop()メソッドでプールを削除
7. Resource Governorの再構成
   ├─ SkipReconfigure: 警告を出力してスキップ
   └─ 通常: $server.ResourceGovernor.Alter()
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{パラメータ検証}
    B -->|InputObject/ResourcePool未指定| C[Stop-Function: エラー]
    B -->|InputObject/SqlInstance未指定| C
    B -->|OK| D{InputObjectあり + Type未指定?}
    D -->|Yes| E[Type自動検出]
    D -->|No| F[SqlInstanceループ開始]
    E --> F
    F --> G[Connect-DbaInstance]
    G --> H{Type?}
    H -->|Internal| I[ResourcePoolsから取得]
    H -->|External| J[ExternalResourcePoolsから取得]
    I --> K[ResourcePoolループ開始]
    J --> K
    K --> L{ShouldProcess確認}
    L -->|Yes| M[Drop実行]
    L -->|No| K
    M --> N{SkipReconfigure?}
    N -->|Yes| O[警告出力]
    N -->|No| P[ResourceGovernor.Alter]
    O --> K
    P --> K
    K --> F
    F --> Q[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | パラメータ必須 | InputObjectまたはResourcePoolのいずれかが必要 | 常に適用 |
| BR-002 | インスタンス必須 | InputObjectまたはSqlInstanceのいずれかが必要 | 常に適用 |
| BR-003 | Type自動検出 | InputObject指定時、オブジェクト型からTypeを自動検出 | Type未指定時 |
| BR-004 | SkipReconfigure警告 | 再構成をスキップすると変更は即座に有効にならない | SkipReconfigure指定時 |
| BR-005 | パイプラインサポート | Get-DbaRgResourcePoolからの出力をパイプラインで受け取り可能 | パイプライン使用時 |

### 計算ロジック

該当なし（削除機能のため）

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| プール削除 | sys.resource_governor_resource_pools | DELETE | リソースプールの削除 |
| プール削除 | sys.resource_governor_external_resource_pools | DELETE | 外部リソースプールの削除 |
| 再構成 | - | ALTER | Resource Governor再構成 |

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

SMOのDrop()、Alter()メソッドが内部的にT-SQLを生成・実行する。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | パラメータエラー | InputObject/ResourcePool未指定 | いずれかを指定 |
| - | パラメータエラー | InputObject/SqlInstance未指定 | いずれかを指定 |
| ConnectionError | 接続エラー | SQL Serverへの接続失敗 | 資格情報とネットワーク接続を確認 |
| - | 削除失敗 | Drop()実行時のエラー | ワークロードグループを先に削除 |

### リトライ仕様

リトライ処理は実装されていない。

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

SMOのDrop()による単一操作。明示的なトランザクション管理は実装されていない。

## パフォーマンス要件

- メタデータ操作のため、軽量な処理
- Resource Governor再構成に数秒かかる場合がある

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

- CONTROL SERVER権限またはsysadminロールが必要
- ShouldProcessによる確認機能を提供
- SqlCredentialパラメータによる安全な認証情報の受け渡し

## 備考

- ワークロードグループが関連付けられているプールは削除できない
- システムプール（internal/default）は削除できない
- 削除前にワークロードグループを先に削除する必要がある

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Remove-DbaRgResourcePool.ps1 | `public/Remove-DbaRgResourcePool.ps1` | .OUTPUTSセクション（57-60行目）で出力仕様を確認（出力なし） |

**読解のコツ**: この機能は出力を返さない。削除操作のみを実行する。

#### Step 2: パラメータ構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Remove-DbaRgResourcePool.ps1 | `public/Remove-DbaRgResourcePool.ps1` | paramブロック（73-86行目）でパラメータ定義を確認 |

**読解のコツ**: InputObjectはobject[]型で、ResourcePoolとExternalResourcePoolの両方を受け入れる。

#### Step 3: メイン処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Remove-DbaRgResourcePool.ps1 | `public/Remove-DbaRgResourcePool.ps1` | processブロック（87-139行目）がメイン処理 |

**主要処理フロー**:
1. **88-95行目**: パラメータ検証（InputObject/ResourcePool、InputObject/SqlInstance）
2. **97-103行目**: InputObject指定時、Type未指定ならオブジェクト型から自動検出
3. **105-116行目**: SqlInstanceループ、ResourcePoolでプールを取得してInputObjectに追加
4. **118-138行目**: ResourcePoolループ、Drop()実行、再構成

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Get-DbaRgResourcePool.ps1 | `public/Get-DbaRgResourcePool.ps1` | リソースプール取得処理 |

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

```
Remove-DbaRgResourcePool
    │
    ├─ Stop-Function (パラメータエラー時)
    │
    ├─ Connect-DbaInstance (SqlInstance指定時)
    │
    ├─ $server.ResourceGovernor.ResourcePools/ExternalResourcePools
    │
    ├─ $resPool.Drop()
    │
    └─ $server.ResourceGovernor.Alter() (再構成)
```

### データフロー図

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

SqlInstance + ResourcePool ──▶ Connect-DbaInstance
       or                              │
InputObject (pipeline) ────────────────┤
                                       │
                                       ▼
                             ResourcePools取得
                                       │
                                       ▼
                                   Drop()
                                       │
                                       ▼
                           ResourceGovernor.Alter() ────▶ なし
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Remove-DbaRgResourcePool.ps1 | `public/Remove-DbaRgResourcePool.ps1` | ソース | 本機能のメイン実装 |
| Get-DbaRgResourcePool.ps1 | `public/Get-DbaRgResourcePool.ps1` | ソース | リソースプール取得 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続 |
| Stop-Function.ps1 | `private/functions/Stop-Function.ps1` | ソース | エラーハンドリング |
| Write-Message.ps1 | `private/functions/Write-Message.ps1` | ソース | メッセージ出力 |
