# 画面設計書 194-PBMストア

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおけるPolicy-Based Management (PBM) ストア取得機能の設計を記述する。Get-DbaPbmStore コマンドを中心に、SQL ServerのPBMストアオブジェクトを取得するための機能仕様を定義する。

### 本画面の処理概要

**業務上の目的・背景**：Policy-Based Management（ポリシーベース管理）ストアは、SQL ServerのPBM機能の基盤となるオブジェクトである。ポリシー、条件、カテゴリなど全てのPBMコンポーネントにアクセスするためのルートコンテナとして機能する。本機能は、他のPBM関連コマンド（Get-DbaPbmCondition、Get-DbaPbmPolicy等）の内部依存関数として使用されるほか、PBMストアオブジェクトを直接取得してプログラム的に操作する際にも使用される。DMF（Declarative Management Framework）という旧名称でも知られるPBMの基盤接続を確立するために必要な機能である。

**画面へのアクセス方法**：PowerShellコマンドラインから `Get-DbaPbmStore` コマンドを実行することでアクセスする。SqlInstanceパラメータは必須である。

**主要な操作・処理内容**：
1. SQL Serverインスタンスへ接続（MinimumVersion 10 = SQL Server 2008以降）
2. SqlStoreConnectionオブジェクトを作成
3. PolicyStoreオブジェクトを作成
4. インスタンス情報をNotePropertyとして付加
5. デフォルト表示から内部プロパティを除外して出力

**画面遷移**：本機能は他のPBM関連コマンドから内部的に呼び出される。Get-DbaPbmCondition、Get-DbaPbmPolicy、Get-DbaPbmObjectSet、Get-DbaPbmCategory、Get-DbaPbmCategorySubscriptionなどが依存する。

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

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 424 | Get-DbaPbmStore | 主機能 | PBMストアの取得 |
| 421 | Get-DbaPbmCondition | 遷移先機能 | PBM条件の取得（依存元） |
| 423 | Get-DbaPbmPolicy | 遷移先機能 | PBMポリシーの取得（依存元） |
| 422 | Get-DbaPbmObjectSet | 遷移先機能 | PBMオブジェクトセットの取得（依存元） |
| 419 | Get-DbaPbmCategory | 遷移先機能 | PBMカテゴリの取得（依存元） |

## 画面種別

詳細（単一オブジェクト取得）

## URL/ルーティング

PowerShellコマンド: `Get-DbaPbmStore`

## 入出力項目

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | 対象SQL Serverインスタンス（Mandatoryかつパイプライン入力可能） |
| SqlCredential | PSCredential | No | 代替認証情報 |
| EnableException | switch | No | 例外処理を有効化 |

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

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全なインスタンス名 |

### 出力プロパティ（除外プロパティ - Select-Object *で表示可能）

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| SqlStoreConnection | object | SQLストア接続オブジェクト |
| ConnectionContext | object | SQL接続コンテキスト |
| Properties | object | SMOオブジェクトプロパティコレクション |
| Urn | string | オブジェクトのUniform Resource Name |
| Parent | object | 親オブジェクト参照 |
| DomainInstanceName | string | ドメインインスタンス名 |
| Metadata | object | メタデータ情報 |
| IdentityKey | object | オブジェクトのIDキー |
| Name | string | ストアオブジェクト名 |

## 表示項目

デフォルトビューでは以下のプロパティが表示される:
- ComputerName, InstanceName, SqlInstance

Select-Object * を使用すると、PolicyStoreオブジェクトの全プロパティにアクセス可能。

## イベント仕様

### 1-PBMストア取得

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

1. **beginブロック**: `Add-PbmLibrary` を呼び出してPBMライブラリを読み込む
2. **processブロック**:
   - PowerShell Coreチェック（LinuxまたはmacOSでは非サポート）
   - Connect-DbaInstanceでSQL Server接続（MinimumVersion 10）
   - SqlStoreConnectionオブジェクトを作成
   - PolicyStoreオブジェクトを作成
   - インスタンス情報をNotePropertyとして付加
   - Select-DefaultViewで除外プロパティを設定して出力

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| ストア取得 | msdb.dbo.syspolicy_* | SELECT | PBMシステムテーブル群への接続 |

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

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

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 発生条件 |
|-------------|------|---------------|---------|
| MSG001 | Error | This command is not supported on Linux or macOS | PowerShell Core（Linux/macOS）で実行時 |
| MSG002 | Error | Failure | 接続エラー発生時 |

## 例外処理

| 例外種別 | 発生条件 | 処理内容 |
|---------|---------|---------|
| 接続エラー | SQL Serverへ接続できない場合 | Stop-Functionでエラー出力、処理続行 |
| プラットフォーム非対応 | PowerShell Core（Linux/macOS）で実行時 | Stop-Functionで処理中断 |
| バージョン不足 | SQL Server 2005以前の場合 | MinimumVersion 10によりエラー |

## 備考

- SQL Server 2008以降（バージョン10以上）が必要
- Windows PowerShellでのみサポート（PowerShell Core非対応）
- DMF（Declarative Management Framework）はPBMの旧称
- 出力オブジェクトは Microsoft.SqlServer.Management.DMF.PolicyStore 型
- 他のPBM関連コマンドの内部依存関数として使用される

---

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

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

### 推奨読解順序

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

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

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

**読解のコツ**: PolicyStoreオブジェクトはPBMの全コンポーネント（Policies、Conditions、PolicyCategoriesなど）へのアクセサを持つ。

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

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

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

**主要処理フロー**:
1. **L74-76**: beginブロックで `Add-PbmLibrary` を呼び出し、PBMライブラリをロード
2. **L77-78**: Test-FunctionInterruptで処理中断チェック
3. **L79-82**: PowerShell Coreチェック

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

ストアオブジェクトの作成・出力処理を理解する。

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

**主要処理フロー**:
- **L84-85**: tryブロック開始、Connect-DbaInstanceで接続（MinimumVersion 10）
- **L86**: SqlStoreConnectionオブジェクトを作成
- **L88**: PolicyStoreオブジェクトを作成
- **L93-95**: ComputerName、InstanceName、SqlInstanceをNotePropertyとして付加
- **L97**: Select-DefaultViewで除外プロパティを設定

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

```
Get-DbaPbmStore
    |
    +-- Add-PbmLibrary (beginブロック)
    |       └-- PBMライブラリの読み込み
    |
    +-- Test-FunctionInterrupt
    |       └-- 処理中断チェック
    |
    +-- Stop-Function (PowerShell Core非対応)
    |       └-- プラットフォームチェックエラー
    |
    +-- Connect-DbaInstance
    |       └-- SQL Server接続確立（MinimumVersion 10）
    |
    +-- New-Object SqlStoreConnection
    |       └-- SFC接続オブジェクト作成
    |
    +-- New-Object PolicyStore
    |       └-- PBMストアオブジェクト作成
    |
    +-- Add-Member (ComputerName, InstanceName, SqlInstance)
    |       └-- インスタンス情報の付加
    |
    └-- Select-DefaultView
            └-- 除外プロパティの設定
```

### データフロー図

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

SqlInstance ─────────┐
(Mandatory)          │
                     │    ┌─────────────────────┐
SqlCredential ───────┼───►│ Connect-DbaInstance │
                     │    │ (MinimumVersion 10) │
                     │    └──────────┬──────────┘
                     │               │
                     │               ▼
                     │    ┌─────────────────────┐
                     │    │ SqlStoreConnection  │
                     │    │ 作成                │
                     │    └──────────┬──────────┘
                     │               │
                     │               ▼
                     │    ┌─────────────────────┐
                     │    │ PolicyStore         │
                     │    │ 作成（DMF）         │
                     │    └──────────┬──────────┘
                     │               │
                     │               ▼
                     │    ┌─────────────────────┐
                     └───►│ メタデータ付加       │──►  PolicyStore
                          │ - ComputerName      │     (出力オブジェクト)
                          │ - InstanceName      │
                          │ - SqlInstance       │
                          └─────────────────────┘
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaPbmStore.ps1 | `public/Get-DbaPbmStore.ps1` | ソース | メイン関数定義 |
| Get-DbaPbmCondition.ps1 | `public/Get-DbaPbmCondition.ps1` | ソース | 依存元：条件取得関数 |
| Get-DbaPbmPolicy.ps1 | `public/Get-DbaPbmPolicy.ps1` | ソース | 依存元：ポリシー取得関数 |
| Get-DbaPbmObjectSet.ps1 | `public/Get-DbaPbmObjectSet.ps1` | ソース | 依存元：オブジェクトセット取得関数 |
| Get-DbaPbmCategory.ps1 | `public/Get-DbaPbmCategory.ps1` | ソース | 依存元：カテゴリ取得関数 |
| Get-DbaPbmCategorySubscription.ps1 | `public/Get-DbaPbmCategorySubscription.ps1` | ソース | 依存元：サブスクリプション取得関数 |
| Copy-DbaPolicyManagement.ps1 | `public/Copy-DbaPolicyManagement.ps1` | ソース | PBMオブジェクトコピー関数 |
