# 画面設計書 112-リソースガバナー

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおけるSQL Server Resource Governor管理機能の設計仕様を記述する。

### 本画面の処理概要

本機能群は、SQL ServerのResource Governor設定の取得・設定・コピーを行う。Resource Governorは、CPU、メモリ、I/Oリソースの使用量を制限・管理するためのSQL Server機能である。

**業務上の目的・背景**：マルチテナント環境や混在ワークロード環境において、特定のクエリやアプリケーションがサーバーリソースを独占することを防ぎ、重要なアプリケーションに適切なリソースを保証するために使用する。DBAがリソース管理ポリシーを設定・監視・移行することを支援する。Enterprise、Datacenter、Developerエディションでのみ使用可能。

**画面へのアクセス方法**：PowerShellコンソールまたはスクリプトから以下のコマンドレットを実行する。
- `Get-DbaResourceGovernor` - Resource Governor設定の取得
- `Set-DbaResourceGovernor` - Resource Governor設定の変更
- `Copy-DbaResourceGovernor` - Resource Governor設定のコピー
- `Get-DbaRgClassifierFunction` - 分類関数の取得

**主要な操作・処理内容**：
1. Resource Governorの有効/無効状態の取得
2. Resource Governorの有効化/無効化
3. 分類関数（Classifier Function）の設定・取得
4. リソースプールとワークロードグループの構成確認
5. インスタンス間でのResource Governor設定のコピー

**画面遷移**：本機能はコマンドラインインターフェースであり、画面遷移は存在しない。Get-DbaResourceGovernorの出力はパイプラインでGet-DbaRgResourcePoolやGet-DbaRgWorkloadGroupに渡すことができる。

**権限による表示制御**：Resource Governorの参照にはVIEW SERVER STATE権限、変更にはCONTROL SERVER権限または sysadminロールが必要。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 461 | Get-DbaResourceGovernor | 主機能 | リソースガバナーの取得 |
| 471 | Set-DbaResourceGovernor | 主機能 | リソースガバナーの設定 |
| 459 | Copy-DbaResourceGovernor | 補助機能 | リソースガバナーのコピー |
| 462 | Get-DbaRgClassifierFunction | 補助機能 | 分類関数の取得 |

## 画面種別

CLIコマンド群（Resource Governor管理）

## URL/ルーティング

```powershell
# Resource Governor取得
Get-DbaResourceGovernor -SqlInstance <インスタンス名> [-SqlCredential <資格情報>]

# Resource Governor設定
Set-DbaResourceGovernor -SqlInstance <インスタンス名> [-Enabled] [-Disabled] [-ClassifierFunction <関数名>]

# Resource Governorコピー
Copy-DbaResourceGovernor -Source <ソース> -Destination <宛先> [-ResourcePool <プール名>] [-Force]

# 分類関数取得
Get-DbaRgClassifierFunction -SqlInstance <インスタンス名>
```

## 入出力項目

### Get-DbaResourceGovernor パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|---|------|-------------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | - | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | - | 認証資格情報 |
| EnableException | switch | No | $false | 例外をスローする |

### Set-DbaResourceGovernor パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|---|------|-------------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | - | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | - | 認証資格情報 |
| Enabled | switch | No | - | Resource Governorを有効化 |
| Disabled | switch | No | - | Resource Governorを無効化 |
| ClassifierFunction | string | No | - | 分類関数名（NULLで削除） |
| WhatIf | switch | No | - | 実行内容をシミュレート |
| Confirm | switch | No | - | 確認プロンプトを表示 |
| EnableException | switch | No | $false | 例外をスローする |

### Copy-DbaResourceGovernor パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|---|------|-------------|------|
| Source | DbaInstanceParameter | Yes | - | コピー元インスタンス |
| SourceSqlCredential | PSCredential | No | - | コピー元認証情報 |
| Destination | DbaInstanceParameter[] | Yes | - | コピー先インスタンス |
| DestinationSqlCredential | PSCredential | No | - | コピー先認証情報 |
| ResourcePool | object[] | No | - | コピーするリソースプール |
| ExcludeResourcePool | object[] | No | - | 除外するリソースプール |
| Force | switch | No | $false | 既存オブジェクトを上書き |
| WhatIf | switch | No | - | 実行内容をシミュレート |
| Confirm | switch | No | - | 確認プロンプトを表示 |
| EnableException | switch | No | $false | 例外をスローする |

## 表示項目

### Get-DbaResourceGovernor 出力

| プロパティ名 | 型 | 説明 |
|-------------|---|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全なインスタンス名 |
| ClassifierFunction | string | 分類関数名（例：[dbo].[fn_classifier]） |
| Enabled | bool | Resource Governor有効/無効 |
| MaxOutstandingIOPerVolume | int | ボリュームあたり最大I/O |
| ReconfigurePending | bool | 再構成保留中フラグ |
| ResourcePools | collection | リソースプールコレクション |
| ExternalResourcePools | collection | 外部リソースプール（ML用） |

### Copy-DbaResourceGovernor 出力

| プロパティ名 | 型 | 説明 |
|-------------|---|------|
| DateTime | DbaDateTime | 実行日時 |
| SourceServer | string | コピー元サーバー |
| DestinationServer | string | コピー先サーバー |
| Name | string | オブジェクト名 |
| Type | string | オブジェクトタイプ |
| Status | string | 処理結果（Successful/Skipped/Failed） |
| Notes | string | 補足情報 |

## イベント仕様

### 1-Get-DbaResourceGovernor実行

1. Connect-DbaInstanceでSQL Serverに接続（最小バージョン10必須）
2. $server.ResourceGovernorプロパティを取得
3. ComputerName、InstanceName、SqlInstanceをNotePropertyとして追加
4. Select-DefaultViewで標準プロパティを選択して出力

### 2-Set-DbaResourceGovernor実行

1. Connect-DbaInstanceでSQL Serverに接続
2. Enabledスイッチが指定された場合、ResourceGovernor.Enabled = $true
3. Disabledスイッチが指定された場合、ResourceGovernor.Enabled = $false
4. ClassifierFunctionが指定された場合：
   - "NULL"の場合はNULLを設定
   - それ以外はGet-DbaDbUdfで関数を検証して設定
5. $server.ResourceGovernor.Alter()で変更を適用
6. Refresh()で状態を更新
7. Get-DbaResourceGovernorで更新後の状態を出力

### 3-Copy-DbaResourceGovernor実行

1. ソースとデスティネーションに接続
2. 分類関数をコピー（存在する場合）
3. 非システムリソースプール（internal, default以外）をコピー
4. 各プールのワークロードグループをコピー
5. ALTER RESOURCE GOVERNOR RECONFIGUREを実行
6. MigrationObjectを出力

## データベース更新仕様

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

| 操作（イベント） | 対象オブジェクト | 操作種別 | 概要 |
|----------------|-----------------|---------|------|
| Set Enabled | Resource Governor | UPDATE | 有効/無効の切り替え |
| Set ClassifierFunction | Resource Governor | UPDATE | 分類関数の設定 |
| Copy Pool | リソースプール | INSERT | プールの作成 |
| Copy Workgroup | ワークロードグループ | INSERT | ワークロードグループの作成 |
| Reconfigure | Resource Governor | EXECUTE | 設定の適用 |

### SQL操作詳細

| 操作 | 実行SQL | 備考 |
|-----|---------|------|
| 有効化 | SMO: ResourceGovernor.Alter() | Enabled=true設定後 |
| 無効化 | SMO: ResourceGovernor.Alter() | Enabled=false設定後 |
| 分類関数設定 | ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = {func}) | |
| 分類関数削除 | ALTER RESOURCE GOVERNOR WITH (CLASSIFIER_FUNCTION = NULL) | |
| 再構成 | ALTER RESOURCE GOVERNOR RECONFIGURE | 変更適用 |

## メッセージ仕様

| メッセージ種別 | メッセージ内容 | 発生条件 |
|---------------|---------------|---------|
| エラー | Failure | 接続失敗 |
| エラー | Couldn't enable Resource Governor | 有効化失敗 |
| エラー | Couldn't disable Resource Governor | 無効化失敗 |
| エラー | Classifier function '{name}' does not exist | 分類関数が存在しない |
| 警告 | The resource governor is not available in this edition | Enterprise/Developer以外のエディション |
| 情報 | Already exists on destination | コピー時に既存 |
| 情報 | Pool '{name}' was skipped because it already exists | プールが既存 |

## 例外処理

| 例外状況 | 処理内容 |
|---------|---------|
| SQL Server 2008未満 | Connect-DbaInstance -MinimumVersion 10で接続拒否 |
| Resource Governor非対応エディション | 警告メッセージを出力、操作をスキップ |
| 分類関数不存在 | Stop-Functionでエラー出力、処理スキップ |
| プール作成失敗 | エラーログ出力、ALTER RESOURCE GOVERNOR RECONFIGUREを実行 |
| 接続失敗 | Stop-Functionでエラー出力、Continue |

## 備考

- Resource GovernorはSQL Server 2008以降で利用可能
- Enterprise、Datacenter、Developerエディションでのみ完全サポート
- 他のエディションではメタデータ操作は可能だが、リソース制御は適用されない
- 分類関数はmasterデータベースに存在する必要がある
- システムプール（internal, default）はコピー対象外
- ReconfigurePendingがtrueの場合、ALTER RESOURCE GOVERNOR RECONFIGUREが必要

---

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

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

### 推奨読解順序

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

Resource Governorの構造は階層的である。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaResourceGovernor.ps1 | `public/Get-DbaResourceGovernor.ps1` | 出力プロパティ（行40-56）を確認 |

**読解のコツ**: SMOのMicrosoft.SqlServer.Management.Smo.ResourceGovernorオブジェクトがベース。ResourcePools、ExternalResourcePoolsがコレクションプロパティとして含まれる。

#### Step 2: 取得処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaResourceGovernor.ps1 | `public/Get-DbaResourceGovernor.ps1` | 行77-94: メイン処理 |

**主要処理フロー**:
1. **行80**: Connect-DbaInstance -MinimumVersion 10
2. **行85**: $server.ResourceGovernorでSMOオブジェクト取得
3. **行87-90**: NotePropertyでComputerName等を追加
4. **行93**: Select-DefaultViewで出力整形

#### Step 3: 設定処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Set-DbaResourceGovernor.ps1 | `public/Set-DbaResourceGovernor.ps1` | 行101-155: 設定変更処理 |

**主要処理フロー**:
1. **行109-110**: 現在の状態を取得
2. **行113-129**: Enabled/Disabledの設定
3. **行132-145**: ClassifierFunctionの設定
4. **行148-150**: Alter()とRefresh()で適用

#### Step 4: コピー処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Copy-DbaResourceGovernor.ps1 | `public/Copy-DbaResourceGovernor.ps1` | 行115-393: コピー処理 |

**主要処理フロー**:
1. **行159-231**: 分類関数のコピー
2. **行246-355**: リソースプールとワークロードグループのコピー
3. **行357-391**: 最終的なReconfigure

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

```
Get-DbaResourceGovernor
    │
    +-- Connect-DbaInstance
    │       └─ MinimumVersion 10でSQL Server接続
    │
    └── Select-DefaultView
            └─ 出力プロパティ選択

Set-DbaResourceGovernor
    │
    +-- Connect-DbaInstance
    │
    +-- Get-DbaDbUdf
    │       └─ 分類関数の存在確認（master DB）
    │
    +-- ResourceGovernor.Alter()
    │       └─ 変更適用
    │
    └── Get-DbaResourceGovernor
            └─ 更新後の状態取得

Copy-DbaResourceGovernor
    │
    +-- Connect-DbaInstance (Source)
    +-- Connect-DbaInstance (Destination)
    │
    +-- Get-DbaRgClassifierFunction
    │       └─ 分類関数取得
    │
    +-- $server.Query()
    │       └─ 分類関数/プール作成SQL実行
    │
    └── Select-DefaultView
            └─ MigrationObject出力
```

### データフロー図

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

SqlInstance ──────────────> Connect-DbaInstance ───────────────>
                            $server.ResourceGovernor ──────────> Microsoft.SqlServer.Management.Smo.ResourceGovernor

Source ───────────────────> SourceServer接続 ─────────────────>
Destination ──────────────> DestinationServer接続 ────────────>
                            分類関数コピー ───────────────────>
                            リソースプールコピー ─────────────> PSCustomObject (MigrationObject)
                            ワークロードグループコピー ───────>
                            RECONFIGURE ──────────────────────>
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaResourceGovernor.ps1 | `public/Get-DbaResourceGovernor.ps1` | ソース | Resource Governor取得 |
| Set-DbaResourceGovernor.ps1 | `public/Set-DbaResourceGovernor.ps1` | ソース | Resource Governor設定 |
| Copy-DbaResourceGovernor.ps1 | `public/Copy-DbaResourceGovernor.ps1` | ソース | Resource Governorコピー |
| Get-DbaRgClassifierFunction.ps1 | `public/Get-DbaRgClassifierFunction.ps1` | ソース | 分類関数取得 |
| Get-DbaRgResourcePool.ps1 | `public/Get-DbaRgResourcePool.ps1` | ソース | リソースプール取得 |
| Get-DbaRgWorkloadGroup.ps1 | `public/Get-DbaRgWorkloadGroup.ps1` | ソース | ワークロードグループ取得 |
