# 機能設計書 376-Get-DbaDbPartitionFunction

## 概要

本ドキュメントは、dbatools PowerShellモジュールのGet-DbaDbPartitionFunctionコマンドの機能設計を定義する。このコマンドはSQL Serverデータベースからパーティション関数の定義とメタデータを取得する機能を提供する。

### 本機能の処理概要

**業務上の目的・背景**：テーブルパーティショニングはSQL Serverの大規模テーブル管理において重要な機能である。パーティション関数は、テーブルやインデックスのデータがパーティション列の値に基づいてどのように分散されるかを定義する。DBAは、パーティション構成の文書化、パーティション分布戦略の分析、メンテナンス操作前の監査などのために、既存のパーティション関数情報を効率的に取得する必要がある。

**機能の利用シーン**：
- パーティション構成の文書化とインベントリ作成
- パーティション分布戦略の分析
- メンテナンス操作前のパーティション構成確認
- 複数データベース間のパーティション設定比較

**主要な処理内容**：
1. SQL Serverインスタンスへの接続（Connect-DbaInstance）
2. アクセス可能なデータベースのフィルタリング
3. 各データベースのPartitionFunctionsコレクションの取得
4. 名前フィルタリングと結果の出力

**関連システム・外部連携**：
- SQL Server（SMO経由での接続）
- SMO PartitionFunction オブジェクト

**権限による制御**：対象データベースへの読み取りアクセス権限が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | コマンドライン/PowerShell | 主画面 | コマンド実行とパラメータ指定 |

## 機能種別

データ取得 / CRUD操作（読み取り）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | Yes | 対象SQL Serverインスタンス（パイプライン入力可） | - |
| SqlCredential | PSCredential | No | SQL Server接続用の代替資格情報 | - |
| Database | object[] | No | 検索対象データベースを限定 | - |
| ExcludeDatabase | object[] | No | 検索から除外するデータベース | - |
| PartitionFunction | string[] | No | 取得するパーティション関数名（ワイルドカード対応） | Alias: Name |
| EnableException | switch | No | 例外処理の有効化 | - |

### 入力データソース

- SqlInstanceパラメータ: ユーザー指定またはパイプライン入力

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| Database | string | パーティション関数を含むデータベース名 |
| CreateDate | DateTime | パーティション関数の作成日時 |
| Name | string | パーティション関数の名前 |
| NumberOfPartitions | int | この関数で定義されるパーティション数 |
| (追加プロパティ) | - | SMO PartitionFunctionオブジェクトの全プロパティ |

### 出力先

PowerShellパイプライン（Microsoft.SqlServer.Management.Smo.PartitionFunction）

## 処理フロー

### 処理シーケンス

```
1. Process ブロック: メインの処理ループ
   └─ 各インスタンスに対する処理
      └─ Connect-DbaInstanceで接続確立
      └─ データベースフィルタリング
         └─ IsAccessible確認
         └─ Database/ExcludeDatabaseによるフィルタリング
      └─ 各データベースに対する処理
         └─ アクセシビリティ再確認
         └─ PartitionFunctionsコレクション取得
         └─ PartitionFunctionパラメータによるフィルタリング
         └─ 追加プロパティの付与（ComputerName, InstanceName等）
         └─ Select-DefaultViewで出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[インスタンスループ開始]
    B --> C[Connect-DbaInstance]
    C --> D{接続成功?}
    D -->|No| E[Stop-Function]
    D -->|Yes| F[データベースフィルタリング]
    F --> G[IsAccessible確認]
    G --> H{Database指定?}
    H -->|Yes| I[Database指定でフィルタ]
    H -->|No| J{ExcludeDatabase指定?}
    I --> J
    J -->|Yes| K[ExcludeDatabaseでフィルタ]
    J -->|No| L[データベースループ開始]
    K --> L
    L --> M{IsAccessible?}
    M -->|No| N[警告出力、スキップ]
    M -->|Yes| O[PartitionFunctions取得]
    O --> P{PartitionFunction指定?}
    P -->|Yes| Q[名前でフィルタ]
    P -->|No| R{関数あり?}
    Q --> R
    R -->|No| S[Verboseメッセージ]
    R -->|Yes| T[各関数に追加プロパティ付与]
    T --> U[Select-DefaultViewで出力]
    N --> V{次のDB?}
    S --> V
    U --> V
    V -->|Yes| L
    V -->|No| W{次のインスタンス?}
    E --> W
    W -->|Yes| B
    W -->|No| X[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | アクセス可能DBのみ | IsAccessible=trueのデータベースのみ処理 | 常に |
| BR-002 | パーティション関数なし時 | パーティション関数が存在しない場合はVerboseメッセージのみ | 関数なし時 |

### 計算ロジック

特になし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| パーティション関数取得 | sys.partition_functions | SELECT（SMO経由） | メタデータ読み取りのみ |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | ConnectionError | SQL Server接続失敗 | Stop-Functionで継続、対象インスタンスをスキップ |
| - | DatabaseNotAccessible | データベースにアクセス不可 | 警告を出力してスキップ |

### リトライ仕様

リトライ機構は実装されていない。

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

トランザクション管理は行わない（読み取り専用）。

## パフォーマンス要件

- SMOコレクションの遅延読み込みを活用
- データベース数に比例した処理時間

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

- SqlCredentialパラメータによる代替資格情報のサポート
- 対象データベースへの読み取り権限が必要

## 備考

- 出力はSMO PartitionFunctionオブジェクトであり、Select-Object *で全プロパティを表示可能
- PartitionFunctionパラメータにはNameエイリアスあり

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaDbPartitionFunction.ps1 | `public/Get-DbaDbPartitionFunction.ps1` | **140-147行目**: 出力プロパティの追加とSelect-DefaultView |

**読解のコツ**: Add-Memberで4つのプロパティを追加し、Select-DefaultViewでデフォルト表示を制御。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaDbPartitionFunction.ps1 | `public/Get-DbaDbPartitionFunction.ps1` | **94-104行目**: パラメータ定義 |

**主要処理フロー**:
1. **94行目**: CmdletBinding属性
2. **96-97行目**: SqlInstanceパラメータ（Mandatory、ValueFromPipeline）
3. **99-100行目**: Database、ExcludeDatabaseパラメータ
4. **101-102行目**: PartitionFunctionパラメータ（Alias: Name）

#### Step 3: Processブロック - データ取得処理

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaDbPartitionFunction.ps1 | `public/Get-DbaDbPartitionFunction.ps1` | **106-151行目**: メイン処理 |

**主要処理フロー**:
- **107-112行目**: Connect-DbaInstance接続
- **114行目**: IsAccessibleでフィルタリング
- **116-121行目**: Database/ExcludeDatabaseフィルタリング
- **123-128行目**: アクセシビリティ再確認
- **129行目**: PartitionFunctionsコレクション取得
- **131-133行目**: 名前フィルタリング
- **140-147行目**: 追加プロパティと出力

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

```
Get-DbaDbPartitionFunction
    │
    ├─ Connect-DbaInstance
    │      └─ SQL Server接続確立
    │
    ├─ $server.Databases
    │      └─ データベースコレクション取得
    │
    ├─ $db.PartitionFunctions
    │      └─ パーティション関数コレクション取得
    │
    ├─ Add-Member
    │      └─ 追加プロパティ付与
    │
    └─ Select-DefaultView
           └─ 出力プロパティ制御
```

### データフロー図

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

SqlInstance ──────────────▶ Connect-DbaInstance ──────────▶ $server
                                   │
                                   ▼
Database, ExcludeDatabase ▶ データベースフィルタリング
                                   │
                                   ▼
PartitionFunction ────────▶ $db.PartitionFunctions
                           + 名前フィルタリング
                                   │
                                   ▼
                           Add-Member ─────────────────▶ SMO PartitionFunction
                           (ComputerName等追加)              + 追加プロパティ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaDbPartitionFunction.ps1 | `public/Get-DbaDbPartitionFunction.ps1` | ソース | メイン機能実装 |
| Remove-DbaDbPartitionFunction.ps1 | `public/Remove-DbaDbPartitionFunction.ps1` | ソース | 関連するパーティション関数削除機能 |
