# 機能設計書 463-Get-DbaRgResourcePool

## 概要

本ドキュメントは、SQL Server Resource Governorのリソースプール情報を取得するGet-DbaRgResourcePool機能の設計を記述する。

### 本機能の処理概要

Get-DbaRgResourcePoolは、SQL Server Resource Governorで定義されたリソースプールの詳細情報を取得する機能である。内部プール（CPU/メモリ）と外部プール（R/Python）の両方をサポートし、CPU、メモリ、IOPSの設定値を一覧表示する。

**業務上の目的・背景**：リソースプールはResource Governorの基盤となる構成要素であり、異なるワークロードに対してCPU、メモリ、I/Oリソースの境界を定義する。DBAはこの機能を使用して、現在のリソース割り当て状況を監視し、パフォーマンスボトルネックをトラブルシューティングし、複数のSQL Serverインスタンス間でリソース管理ポリシーを監査できる。これにより、ワークロード間のリソース競合を防止し、システム全体のパフォーマンスを最適化することが可能になる。

**機能の利用シーン**：
- Resource Governor構成の監査・ドキュメント化時
- リソース割り当ての現状把握とキャパシティプランニング
- パフォーマンス問題のトラブルシューティング時
- 複数インスタンス間でのリソースプール構成の比較

**主要な処理内容**：
1. SqlInstanceまたはInputObjectからResourceGovernorオブジェクトを取得
2. TypeパラメータによりInternalまたはExternalプールを選択
3. 選択されたプールコレクションにカスタムプロパティを追加
4. デフォルト表示プロパティを設定して結果を出力

**関連システム・外部連携**：Get-DbaResourceGovernorからパイプライン入力を受け取ることができる。SMOを使用してSQL Serverのリソースプール情報を取得する。

**権限による制御**：Resource Governor情報の取得にはVIEW SERVER STATE権限が推奨される。

## 関連画面

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

## 機能種別

SELECT / 情報取得

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | No | 対象のSQL Serverインスタンス | ValueFromPipeline |
| SqlCredential | PSCredential | No | 代替認証情報 | - |
| Type | String | No | プールタイプ（Internal/External） | ValidateSet: Internal, External。デフォルト: Internal |
| InputObject | Microsoft.SqlServer.Management.Smo.ResourceGovernor[] | No | ResourceGovernorオブジェクト | ValueFromPipeline |
| EnableException | switch | No | 例外を直接スローするかどうか | - |

### 入力データソース

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

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | String | SQL Serverインスタンスのコンピュータ名 |
| InstanceName | String | SQL Serverインスタンス名 |
| SqlInstance | String | 完全なSQL Serverインスタンス名 |
| Id | Int32 | リソースプールの一意識別子 |
| Name | String | リソースプール名 |
| CapCpuPercentage | Int32 | CPU上限パーセンテージ（Externalプールは0-100、Internalは常に0） |
| IsSystemObject | Boolean | システム定義プールかどうか |
| MaximumCpuPercentage | Int32 | 最大CPUパーセンテージ（0-100） |
| MaximumIopsPerVolume | Int32 | ボリュームあたりの最大IOPS（Externalプールのみ） |
| MaximumMemoryPercentage | Int32 | 最大メモリパーセンテージ（0-100） |
| MinimumCpuPercentage | Int32 | 最小CPUパーセンテージ（0-100） |
| MinimumIopsPerVolume | Int32 | ボリュームあたりの最小IOPS（Externalプールのみ） |
| MinimumMemoryPercentage | Int32 | 最小メモリパーセンテージ（0-100） |
| WorkloadGroups | WorkloadGroupCollection | プールに関連付けられたワークロードグループのコレクション |

### 出力先

- PowerShellパイプライン（標準出力）
- Microsoft.SqlServer.Management.Smo.ResourcePool または ExternalResourcePool オブジェクト

## 処理フロー

### 処理シーケンス

```
1. SqlInstanceが指定されている場合、Get-DbaResourceGovernorを呼び出し
   └─ ResourceGovernorオブジェクトをInputObjectに追加
2. InputObjectの各ResourceGovernorオブジェクトに対して繰り返し処理
3. Typeパラメータに基づいてプールコレクションを選択
   ├─ External: $resourcegov.ExternalResourcePools
   └─ Internal: $resourcegov.ResourcePools
4. プールコレクションにカスタムプロパティを追加
   └─ ComputerName, InstanceName, SqlInstance
5. Select-DefaultViewで出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{SqlInstance指定?}
    B -->|Yes| C[Get-DbaResourceGovernor呼び出し]
    B -->|No| D[InputObject使用]
    C --> D
    D --> E[ResourceGovernorループ開始]
    E --> F{Type == External?}
    F -->|Yes| G[ExternalResourcePools取得]
    F -->|No| H[ResourcePools取得]
    G --> I{プールが存在?}
    H --> I
    I -->|Yes| J[Add-Memberでプロパティ追加]
    I -->|No| K[次のResourceGovernorへ]
    J --> L[Select-DefaultViewで出力]
    L --> K
    K --> E
    E --> M[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | デフォルトプールタイプ | Typeパラメータのデフォルト値はInternal | Type未指定時 |
| BR-002 | パイプラインサポート | Get-DbaResourceGovernorからの出力をパイプラインで受け取り可能 | パイプライン使用時 |
| BR-003 | 外部プールの可用性 | ExternalResourcePoolsはSQL Server 2016以降で利用可能 | Type=External時 |
| BR-004 | 複数プール出力 | 各インスタンスに定義された全てのプールを出力 | 常に適用 |

### 計算ロジック

該当なし（情報取得機能のため）

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 情報取得 | sys.resource_governor_resource_pools | SELECT | リソースプール構成の取得（SMO経由） |
| 情報取得 | sys.resource_governor_external_resource_pools | SELECT | 外部リソースプール構成の取得（SMO経由） |

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

SMOを使用するため、直接のテーブルアクセスは行わない。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| ConnectionError | 接続エラー | SQL Serverへの接続失敗 | 資格情報とネットワーク接続を確認 |

### リトライ仕様

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

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

読み取り専用操作のため、トランザクション管理は不要。

## パフォーマンス要件

- メタデータ取得のみのため、軽量な処理
- 通常1秒未満で完了

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

- VIEW SERVER STATE権限が推奨される
- SqlCredentialパラメータによる安全な認証情報の受け渡し

## 備考

- Internal/Externalの両タイプを同時に取得することはできない
- External Resource PoolsはMachine Learning Services使用時に関連

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaRgResourcePool.ps1 | `public/Get-DbaRgResourcePool.ps1` | .OUTPUTSセクション（32-61行目）で出力オブジェクトの構造を確認 |

**読解のコツ**: Type=Internal時はResourcePool、Type=External時はExternalResourcePoolが返される。両者は類似しているが異なるSMOクラス。

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

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

**主要処理フロー**:
1. **104-106行目**: SqlInstance指定時はGet-DbaResourceGovernorを呼び出してInputObjectに追加
2. **108行目**: InputObject（ResourceGovernor）のループ開始
3. **109-116行目**: Type=Externalの場合はExternalResourcePools、そうでなければResourcePoolsを取得
4. **111-115行目**: Add-Memberでカスタムプロパティ追加、Select-DefaultViewで出力（External）
5. **118-124行目**: Add-Memberでカスタムプロパティ追加、Select-DefaultViewで出力（Internal）

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaResourceGovernor.ps1 | `public/Get-DbaResourceGovernor.ps1` | ResourceGovernorオブジェクトの取得方法 |

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

```
Get-DbaRgResourcePool
    │
    ├─ Get-DbaResourceGovernor (SqlInstance指定時)
    │      └─ Connect-DbaInstance
    │
    ├─ $resourcegov.ExternalResourcePools (Type=External)
    │      └─ Add-Member + Select-DefaultView
    │
    └─ $resourcegov.ResourcePools (Type=Internal)
           └─ Add-Member + Select-DefaultView
```

### データフロー図

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

SqlInstance ─────────▶ Get-DbaResourceGovernor ───▶ ResourceGovernor[]
       or                        │
InputObject (pipeline) ──────────┘
                                 │
                    ┌────────────┴────────────┐
                    ▼                          ▼
         ExternalResourcePools         ResourcePools
            (Type=External)           (Type=Internal)
                    │                          │
                    └──────────┬───────────────┘
                               ▼
                        Add-Member (拡張)
                               │
                               ▼
                     Select-DefaultView ────▶ ResourcePool Objects
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaRgResourcePool.ps1 | `public/Get-DbaRgResourcePool.ps1` | ソース | 本機能のメイン実装 |
| Get-DbaResourceGovernor.ps1 | `public/Get-DbaResourceGovernor.ps1` | ソース | ResourceGovernorオブジェクト取得 |
| Select-DefaultView.ps1 | `private/functions/Select-DefaultView.ps1` | ソース | デフォルト表示プロパティ設定 |
