# 機能設計書 462-Get-DbaRgClassifierFunction

## 概要

本ドキュメントは、SQL ServerのResource Governor分類関数を取得するGet-DbaRgClassifierFunction機能の設計を記述する。

### 本機能の処理概要

Get-DbaRgClassifierFunctionは、Resource Governorがワークロードグループの割り当てに使用する分類関数を取得する機能である。分類関数は、受信接続のプロパティ（ログイン名、アプリケーション名、ホスト名など）を評価し、適切なワークロードグループ名を返すビジネスロジックを含むユーザー定義関数である。

**業務上の目的・背景**：Resource Governorでワークロードを適切に分類・管理するためには、分類関数の設定と動作を理解することが不可欠である。この関数は常にmasterデータベースに格納され、SQL Serverがワークロードをどのように分類しているかを把握するための重要な情報源となる。DBAはこの機能を使用して、現在設定されている分類ロジックを確認し、必要に応じて移行やドキュメント化を行うことができる。

**機能の利用シーン**：
- Resource Governor分類ロジックの確認・監査時
- 別のSQL Serverインスタンスへの分類関数の移行準備時
- ワークロード分類の問題をトラブルシューティングする際
- Resource Governor構成のドキュメント作成時

**主要な処理内容**：
1. SqlInstanceまたはInputObject（ResourceGovernorオブジェクト）から処理対象を取得
2. ResourceGovernorオブジェクトのClassifierFunctionプロパティから分類関数名を取得
3. masterデータベースのUserDefinedFunctionsコレクションから該当する関数を検索
4. カスタムプロパティを追加して結果を出力

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

**権限による制御**：masterデータベースのユーザー定義関数を読み取る権限が必要。通常はVIEW DEFINITION権限があれば十分。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 112 | リソースガバナー | 補助機能 | 分類関数の取得 |

## 機能種別

SELECT / 情報取得

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | No | 対象のSQL Serverインスタンス | - |
| SqlCredential | PSCredential | No | 代替認証情報 | Windows認証、SQL認証、AD認証をサポート |
| InputObject | Microsoft.SqlServer.Management.Smo.ResourceGovernor[] | No | Get-DbaResourceGovernorからのパイプライン入力 | ValueFromPipeline |
| EnableException | switch | No | 例外を直接スローするかどうか | - |

### 入力データソース

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

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | String | SQL Serverインスタンスのコンピュータ名 |
| InstanceName | String | SQL Serverインスタンス名 |
| SqlInstance | String | 完全なSQL Serverインスタンス名 |
| Database | String | 関数が格納されているデータベース（常にmaster） |
| Schema | String | 分類関数を含むスキーマ名 |
| CreateDate | DateTime | 分類関数の作成日時 |
| DateLastModified | DateTime | 分類関数の最終更新日時 |
| Name | String | 分類関数の名前 |
| DataType | String | 関数の戻り値のデータ型 |

### 出力先

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

## 処理フロー

### 処理シーケンス

```
1. SqlInstanceが指定されている場合、Get-DbaResourceGovernorを呼び出してInputObjectに追加
   └─ 各インスタンスからResourceGovernorオブジェクトを取得
2. InputObjectの各ResourceGovernorオブジェクトに対して繰り返し処理
   └─ ResourceGovernorからParent（Serverオブジェクト）を取得
3. masterデータベースのUserDefinedFunctionsコレクションを検索
   └─ [Schema].[Name]形式でClassifierFunctionと照合
4. 該当する分類関数が見つかった場合、カスタムプロパティを追加
   └─ ComputerName, InstanceName, SqlInstance, Database
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[Parentからサーバー取得]
    F --> G[master.UserDefinedFunctionsを検索]
    G --> H{ClassifierFunctionと一致?}
    H -->|Yes| I[カスタムプロパティ追加]
    H -->|No| J[次のUDFへ]
    J --> G
    I --> K[Select-DefaultViewで出力]
    K --> L[次のResourceGovernorへ]
    L --> E
    E --> M[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | 分類関数の格納場所 | 分類関数は常にmasterデータベースに格納される | 全ての場合 |
| BR-002 | パイプラインサポート | Get-DbaResourceGovernorからの出力をパイプラインで受け取り可能 | パイプライン使用時 |
| BR-003 | 関数名照合形式 | [Schema].[Name]形式でClassifierFunctionプロパティと照合 | 分類関数検索時 |
| BR-004 | 分類関数未設定時 | ClassifierFunctionが設定されていない場合は何も返さない | 未設定時 |

### 計算ロジック

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

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 情報取得 | master.sys.objects | SELECT | ユーザー定義関数のメタデータ取得（SMO経由） |

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

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

## エラー処理

### エラーケース一覧

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

### リトライ仕様

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

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

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

## パフォーマンス要件

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

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

- masterデータベースへのアクセス権限が必要
- VIEW DEFINITION権限が推奨される
- SqlCredentialパラメータによる安全な認証情報の受け渡し

## 備考

- 分類関数が設定されていない場合、出力は空になる
- 分類関数の戻り値のDataTypeはnvarcharである必要がある

---

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

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

### 推奨読解順序

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

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

**読解のコツ**: 出力はMicrosoft.SqlServer.Management.Smo.UserDefinedFunctionクラスにカスタムプロパティが追加されたもの。

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

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

**主要処理フロー**:
1. **90-92行目**: SqlInstanceが指定されていればGet-DbaResourceGovernorを呼び出してInputObjectに追加
2. **94行目**: InputObject（ResourceGovernor）のループ開始
3. **95行目**: ResourceGovernorのParent（Serverオブジェクト）を取得
4. **98-103行目**: master.UserDefinedFunctionsをループし、ClassifierFunctionと照合
5. **105-110行目**: 一致した場合、Add-Memberでカスタムプロパティ追加
6. **112行目**: Select-DefaultViewで出力

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

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

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

```
Get-DbaRgClassifierFunction
    │
    ├─ Get-DbaResourceGovernor (SqlInstance指定時)
    │      └─ Connect-DbaInstance
    │
    ├─ $resourcegov.Parent (Serverオブジェクト取得)
    │
    ├─ $server.Databases["master"].UserDefinedFunctions
    │
    ├─ Add-Member (カスタムプロパティ追加)
    │
    └─ Select-DefaultView (出力フォーマット)
```

### データフロー図

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

SqlInstance ─────────▶ Get-DbaResourceGovernor ───▶ ResourceGovernor[]
       or                        │
InputObject (pipeline) ──────────┘
                                 │
                                 ▼
                          $resourcegov.Parent
                                 │
                                 ▼
                    master.UserDefinedFunctions
                                 │
                                 ▼
                      ClassifierFunctionと照合
                                 │
                                 ▼
                        Add-Member (拡張)
                                 │
                                 ▼
                      Select-DefaultView ────▶ UserDefinedFunction Object
```

### 関連ファイル一覧

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