# 画面設計書 191-PBM条件

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおけるPolicy-Based Management (PBM) 条件取得機能の設計を記述する。Get-DbaPbmCondition コマンドを中心に、SQL ServerのPBM条件情報を取得・表示するための機能仕様を定義する。

### 本画面の処理概要

**業務上の目的・背景**：Policy-Based Management（ポリシーベース管理）は、SQL Serverのコンプライアンスと構成管理のための機能である。条件（Condition）はPBMポリシーの構成要素であり、データベースオブジェクトの評価基準を定義する。本機能は、既存のPBM条件を一覧・確認することで、ポリシーの監査、トラブルシューティング、コンプライアンスフレームワークの棚卸しを支援する。複数のSQL Serverインスタンス間で条件を比較し、一貫したポリシー管理を実現するために必要な機能である。

**画面へのアクセス方法**：PowerShellコマンドラインから `Get-DbaPbmCondition` コマンドを実行することでアクセスする。パイプライン経由で `Get-DbaPbmStore` からの入力を受け取ることも可能である。

**主要な操作・処理内容**：
1. SQL Serverインスタンスへ接続し、PBMストアを取得
2. 条件コレクションをフィルタリング（システムオブジェクト除外/条件名フィルタ）
3. 各条件にインスタンス情報を付加して出力
4. パイプライン経由での複数インスタンス処理

**画面遷移**：本機能から `Get-DbaPbmStore` を内部的に呼び出す。また、取得した条件情報は `Get-DbaPbmPolicy` と組み合わせて使用されることが多い。

**権限による表示制御**：SQL Server上でPBM情報にアクセスするための適切な権限（通常はsysadminまたはServerAdmin）が必要。権限不足の場合は接続エラーとなる。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 421 | Get-DbaPbmCondition | 主機能 | PBM条件の取得 |
| 424 | Get-DbaPbmStore | 補助機能 | PBMストアへの接続・取得 |
| 423 | Get-DbaPbmPolicy | 遷移先機能 | 条件を使用するポリシーの取得 |
| 387 | Copy-DbaPolicyManagement | 遷移先機能 | PBM条件のコピー |

## 画面種別

一覧（コマンドライン出力）

## URL/ルーティング

PowerShellコマンド: `Get-DbaPbmCondition`

## 入出力項目

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | No | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | 代替認証情報 |
| Condition | string[] | No | 取得対象の条件名フィルタ |
| IncludeSystemObject | switch | No | システム条件を含めるかどうか |
| InputObject | psobject[] | No | パイプライン入力（Get-DbaPbmStoreからの入力） |
| EnableException | switch | No | 例外処理を有効化 |

### 出力プロパティ（デフォルト表示）

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全なインスタンス名 |
| Id | int | 条件のID |
| Name | string | 条件名 |
| CreateDate | DateTime | 作成日時 |
| CreatedBy | string | 作成者 |
| DateModified | DateTime | 変更日時 |
| Description | string | 説明 |
| ExpressionNode | object | 条件式ノード |
| Facet | string | 対象ファセット |
| HasScript | bool | スクリプト式を含むか |
| IsSystemObject | bool | システムオブジェクトか |
| ModifiedBy | string | 変更者 |

## 表示項目

デフォルトビューでは以下のプロパティが表示される:
- ComputerName, InstanceName, SqlInstance, Id, Name
- CreateDate, CreatedBy, DateModified, Description
- ExpressionNode, Facet, HasScript, IsSystemObject, ModifiedBy

## イベント仕様

### 1-条件一覧取得

コマンド実行時に以下の処理フローが実行される:

1. **beginブロック**: `Add-PbmLibrary` を呼び出してPBMライブラリを読み込む
2. **processブロック**:
   - PowerShell Coreで実行時は非サポートエラーを出力
   - SqlInstance指定時は内部で `Get-DbaPbmStore` を呼び出し
   - 取得したストアから条件コレクションを取得
   - IncludeSystemObject指定がない場合、システム条件を除外
   - Condition指定時は名前でフィルタリング
   - 各条件にインスタンス情報を付加して出力

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| 条件取得 | msdb.dbo.syspolicy_conditions | SELECT | PBM条件情報の読み取り |

### テーブル別更新項目詳細

本機能は参照のみであり、データベースの更新は行わない。

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 発生条件 |
|-------------|------|---------------|---------|
| MSG001 | Warning | This command is not yet supported in PowerShell Core | PowerShell Coreで実行時 |
| MSG002 | Verbose | Processing {conditionname} | 各条件処理時 |

## 例外処理

| 例外種別 | 発生条件 | 処理内容 |
|---------|---------|---------|
| 接続エラー | SQL Serverへ接続できない場合 | Stop-Functionでエラー出力 |
| 権限エラー | PBM情報へアクセス権限がない場合 | 接続時にエラーとなる |
| プラットフォーム非対応 | PowerShell Coreで実行時 | Stop-Functionで処理中断 |

## 備考

- SQL Server 2008以降（バージョン10以上）が必要
- Windows PowerShellでのみサポート（PowerShell Core非対応）
- システム条件はデフォルトで除外され、IncludeSystemObjectスイッチで表示可能
- 出力オブジェクトは Microsoft.SqlServer.Management.Dmf.Condition 型

---

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

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

### 推奨読解順序

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

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

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

**読解のコツ**: PowerShellのヘルプドキュメント内の.OUTPUTSセクションで、返却されるオブジェクトのプロパティ一覧と説明を確認する。

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

Get-DbaPbmCondition関数のパラメータとbeginブロックを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaPbmCondition.ps1 | `public/Get-DbaPbmCondition.ps1` | param()ブロックでパラメータ定義を確認（L89-98） |

**主要処理フロー**:
1. **L99-101**: beginブロックで `Add-PbmLibrary` を呼び出し、PBMライブラリをロード
2. **L102-107**: PowerShell Coreチェック、非サポート時は処理中断
3. **L108-110**: SqlInstance指定時にGet-DbaPbmStoreを内部呼び出し

#### Step 3: メイン処理ロジックを理解する

条件の取得・フィルタリング・出力処理を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaPbmCondition.ps1 | `public/Get-DbaPbmCondition.ps1` | processブロックのメイン処理（L111-130） |

**主要処理フロー**:
- **L111-112**: ストアから条件コレクションを取得
- **L114-116**: システム条件除外フィルタリング
- **L118-120**: 条件名フィルタリング
- **L122-128**: 各条件にインスタンス情報を付加してパイプラインに出力

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

Get-DbaPbmStoreの処理を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Get-DbaPbmStore.ps1 | `public/Get-DbaPbmStore.ps1` | PolicyStoreオブジェクトの作成処理（L77-99） |

**主要処理フロー**:
- **L85**: Connect-DbaInstance でSQL Serverに接続（MinimumVersion 10）
- **L86**: SqlStoreConnectionオブジェクトを作成
- **L88**: PolicyStoreオブジェクトを作成
- **L93-95**: インスタンス情報をNotePropertyとして付加

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

```
Get-DbaPbmCondition
    |
    +-- Add-PbmLibrary (beginブロック)
    |       └-- PBMライブラリの読み込み
    |
    +-- Test-FunctionInterrupt
    |       └-- 処理中断チェック
    |
    +-- Stop-Function (PowerShell Core非対応エラー)
    |
    +-- Get-DbaPbmStore (SqlInstance指定時)
    |       |
    |       +-- Connect-DbaInstance
    |       |       └-- SQL Server接続確立
    |       |
    |       +-- New-Object SqlStoreConnection
    |       |       └-- SFC接続オブジェクト作成
    |       |
    |       └-- New-Object PolicyStore
    |               └-- PBMストアオブジェクト作成
    |
    +-- Where-Object IsSystemObject
    |       └-- システム条件フィルタリング
    |
    +-- Where-Object Name
    |       └-- 条件名フィルタリング
    |
    +-- Add-Member (ComputerName, InstanceName, SqlInstance)
    |       └-- インスタンス情報の付加
    |
    └-- Select-DefaultView
            └-- デフォルト表示プロパティの設定
```

### データフロー図

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

SqlInstance ─────────┐
                     │
SqlCredential ───────┤
                     │    ┌─────────────────────┐
Condition ───────────┼───►│ Get-DbaPbmStore     │
                     │    │ (内部呼び出し)       │
IncludeSystemObject ─┤    └──────────┬──────────┘
                     │               │
InputObject ─────────┘               ▼
                          ┌─────────────────────┐
                          │ PolicyStore.        │
                          │ Conditions          │
                          │ (条件コレクション)   │
                          └──────────┬──────────┘
                                     │
                                     ▼
                          ┌─────────────────────┐
                          │ フィルタリング処理   │
                          │ - システム条件除外  │
                          │ - 条件名フィルタ    │
                          └──────────┬──────────┘
                                     │
                                     ▼
                          ┌─────────────────────┐
                          │ メタデータ付加       │──►  Condition[]
                          │ - ComputerName      │     (出力オブジェクト)
                          │ - InstanceName      │
                          │ - SqlInstance       │
                          └─────────────────────┘
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaPbmCondition.ps1 | `public/Get-DbaPbmCondition.ps1` | ソース | メイン関数定義 |
| Get-DbaPbmStore.ps1 | `public/Get-DbaPbmStore.ps1` | ソース | PBMストア取得関数 |
| Copy-DbaPolicyManagement.ps1 | `public/Copy-DbaPolicyManagement.ps1` | ソース | PBM条件コピー関数 |
| Get-DbaPbmPolicy.ps1 | `public/Get-DbaPbmPolicy.ps1` | ソース | PBMポリシー取得関数 |
