# 機能設計書 421-Get-DbaPbmCondition

## 概要

本ドキュメントは、dbatools PowerShellモジュールの`Get-DbaPbmCondition`コマンドレットに関する機能設計書である。このコマンドレットは、SQL ServerのPolicy-Based Management（PBM）の条件（Condition）を取得する機能を提供する。

### 本機能の処理概要

`Get-DbaPbmCondition`は、SQL ServerインスタンスからPolicy-Based Management（ポリシーベース管理）の条件を取得するコマンドレットである。条件はPBMポリシーの基盤となる構成要素であり、データベースオブジェクトがコンプライアンスに準拠しているかを評価するためのルールと基準を定義する。

**業務上の目的・背景**：企業のデータベース環境では、セキュリティ、パフォーマンス、命名規則などの標準化されたポリシーを維持することが重要である。PBMの条件は、これらのポリシーを構成する基礎的な要素であり、「何をチェックするか」「どの値が許容されるか」を定義する。本機能により、DBAは複数のインスタンスにわたるコンプライアンス条件の監査、ポリシー評価の失敗原因の調査、コンプライアンスフレームワークのインベントリ管理を効率的に行うことができる。

**機能の利用シーン**：
- 既存の条件を監査し、ドキュメント化する場合
- ポリシー評価の失敗をトラブルシューティングする場合
- 複数インスタンス間でコンプライアンス条件を比較する場合
- SQL Server Management Studioを使用せずに条件設定を確認する場合

**主要な処理内容**：
1. 指定されたSQL Serverインスタンスに接続し、PBMストアを取得する
2. PBMストアから条件のコレクションを取得する
3. システムオブジェクトのフィルタリングを適用する（オプション）
4. 条件名によるフィルタリングを適用する（オプション）
5. インスタンス識別情報を付加して結果を出力する

**関連システム・外部連携**：SQL Server Declarative Management Framework（DMF）と連携し、Microsoft.SqlServer.Management.Dmf名前空間のオブジェクトを使用する。

**権限による制御**：PBMストアへのアクセスには、対象SQL Serverインスタンスへの適切な接続権限が必要である。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | SQL Server Management Studio - Policy Management | 参照画面 | SSMS上でのPolicy-Based Management条件の表示に相当 |

## 機能種別

データ取得（SELECT相当）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | No | 対象SQL Serverインスタンス。パイプライン入力可能。 | 有効なSQL Server接続文字列 |
| SqlCredential | PSCredential | No | 代替資格情報。Windows認証、SQL Server認証、AD認証をサポート。 | 有効なPSCredentialオブジェクト |
| Condition | string[] | No | 取得する条件名のフィルター。ワイルドカード対応。 | なし |
| InputObject | psobject[] | No | Get-DbaPbmStoreからのパイプライン入力。 | PolicyStoreオブジェクト |
| IncludeSystemObject | switch | No | システム条件を結果に含める。 | なし |
| EnableException | switch | No | 例外をスローするモードを有効化。 | なし |

### 入力データソース

- SQL Serverインスタンス直接指定（SqlInstanceパラメータ）
- Get-DbaPbmStoreコマンドからのパイプライン入力（InputObjectパラメータ）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverインスタンスのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名（コンピュータ\インスタンス形式） |
| Id | int | 条件の一意識別子 |
| Name | string | 条件名 |
| CreateDate | DateTime | 条件の作成日時 |
| CreatedBy | string | 条件を作成したユーザー |
| DateModified | DateTime | 条件の最終更新日時 |
| Description | string | 条件の説明 |
| ExpressionNode | object | 条件ロジックを定義する式ツリー |
| Facet | string | 条件が適用されるファセット（Database、Server、Tableなど） |
| HasScript | bool | 動的スクリプト式を含むかどうか |
| IsSystemObject | bool | システム提供の条件かユーザー作成かを示す |
| ModifiedBy | string | 条件を最後に変更したユーザー |

### 出力先

- PowerShellパイプライン（標準出力）
- Microsoft.SqlServer.Management.Dmf.Conditionオブジェクトとして出力

## 処理フロー

### 処理シーケンス

```
1. beginブロック
   └─ Add-PbmLibrary関数を呼び出し、PBM関連ライブラリをロード
2. processブロック
   ├─ Test-FunctionInterruptでの中断チェック
   ├─ PowerShell Core環境チェック（非サポートの場合は処理停止）
   ├─ SqlInstanceパラメータの処理
   │   └─ 各インスタンスに対してGet-DbaPbmStoreを呼び出し
   └─ InputObject（PBMストア）の処理
       ├─ ストアから全条件を取得
       ├─ IncludeSystemObjectフィルターの適用
       ├─ Conditionフィルターの適用
       └─ 各条件にインスタンス情報を追加して出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[Add-PbmLibrary]
    B --> C{Test-FunctionInterrupt?}
    C -->|Yes| Z[終了]
    C -->|No| D{PowerShell Core?}
    D -->|Yes| E[Stop-Function]
    E --> Z
    D -->|No| F{SqlInstance指定?}
    F -->|Yes| G[Get-DbaPbmStore呼び出し]
    G --> H[InputObjectに追加]
    F -->|No| H
    H --> I[各storeを処理]
    I --> J[全条件を取得]
    J --> K{IncludeSystemObject?}
    K -->|No| L[システムオブジェクト除外]
    K -->|Yes| M{Condition指定?}
    L --> M
    M -->|Yes| N[名前でフィルター]
    M -->|No| O[各条件を処理]
    N --> O
    O --> P[インスタンス情報を追加]
    P --> Q[Select-DefaultViewで出力]
    Q --> R{次のstore?}
    R -->|Yes| I
    R -->|No| Z
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | システムオブジェクト除外 | デフォルトでシステム条件は結果から除外される | IncludeSystemObjectスイッチが指定されていない場合 |
| BR-002 | PowerShell Core非サポート | PowerShell Coreでは実行不可 | PSEditionが"Core"の場合 |
| BR-003 | 条件名フィルター | 完全一致でConditionパラメータと比較 | Conditionパラメータが指定された場合 |

### 計算ロジック

特になし（データ取得機能のため）

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| PBM条件取得 | msdb.dbo.syspolicy_conditions | SELECT | PBM条件の取得（SMO経由） |

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

#### msdb.dbo.syspolicy_conditions（SMO経由）

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | condition_id | 全条件を取得 | SMO経由でアクセス |
| SELECT | name | 条件名でフィルター可能 | Conditionパラメータで指定 |
| SELECT | is_system | システムオブジェクトフィルター | IncludeSystemObjectで制御 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | Stop-Function | PowerShell Core環境で実行 | Windows PowerShellで実行する |
| - | ConnectionError | SQL Server接続失敗 | 接続情報を確認する |

### リトライ仕様

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

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

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

## パフォーマンス要件

特に規定なし。PBM条件は通常少数であり、パフォーマンス影響は軽微。

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

- SQL Server認証、Windows認証、Azure AD認証をサポート
- 接続資格情報はPSCredentialオブジェクトで安全に管理
- MFAサポートが必要な場合はConnect-DbaInstanceの事前使用を推奨

## 備考

- SQL Server 2008以降（Version 10以上）が必要
- Policy-Based ManagementはSQL Server Enterprise機能の一部

---

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

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

### 推奨読解順序

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

PBM条件オブジェクトの構造を理解することが重要である。

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

**読解のコツ**: Microsoft.SqlServer.Management.Dmf.Conditionは SMO の PBM 名前空間に属するオブジェクトである。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaPbmCondition.ps1 | `public/Get-DbaPbmCondition.ps1` | パラメータ定義（89-98行目）で入力の受け取り方を確認 |

**主要処理フロー**:
1. **99-101行目**: beginブロックでAdd-PbmLibraryを呼び出し
2. **102-107行目**: PowerShell Core非サポートチェック
3. **108-110行目**: SqlInstanceからPBMストアを取得
4. **111-129行目**: 条件のフィルタリングと出力処理

#### Step 3: PBMストア取得を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaPbmStore.ps1 | `public/Get-DbaPbmStore.ps1` | PBMストアオブジェクトの取得方法（83-98行目） |

**主要処理フロー**:
- **85行目**: Connect-DbaInstanceで接続（MinimumVersion 10）
- **86行目**: SqlStoreConnectionオブジェクトの作成
- **88行目**: PolicyStoreオブジェクトの作成

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

```
Get-DbaPbmCondition
    │
    ├─ Add-PbmLibrary
    │      └─ PBMライブラリのロード
    │
    ├─ Test-FunctionInterrupt
    │      └─ 中断チェック
    │
    ├─ Get-DbaPbmStore
    │      ├─ Connect-DbaInstance
    │      │      └─ SQL Server接続
    │      └─ New-Object PolicyStore
    │
    └─ Select-DefaultView
           └─ 出力プロパティの制限
```

### データフロー図

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

SqlInstance ───────▶ Get-DbaPbmStore ───────▶ PolicyStore
                            │
                            ▼
                     store.Conditions
                            │
                            ▼
                   IncludeSystemObject
                      フィルター
                            │
                            ▼
                    Condition名
                      フィルター
                            │
                            ▼
                  Add-Member（インスタンス情報）
                            │
                            ▼
                    Select-DefaultView ───────▶ Condition[]
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaPbmCondition.ps1 | `public/Get-DbaPbmCondition.ps1` | ソース | メイン機能の実装 |
| Get-DbaPbmStore.ps1 | `public/Get-DbaPbmStore.ps1` | ソース | PBMストアの取得 |
| Add-PbmLibrary.ps1 | `private/Add-PbmLibrary.ps1` | ソース | PBMライブラリのロード |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続 |
| Select-DefaultView.ps1 | `private/Select-DefaultView.ps1` | ソース | 出力プロパティの制限 |
