# 機能設計書 556-Get-DbaDbUserDefinedTableType

## 概要

本ドキュメントは、SQL Serverデータベースのユーザー定義テーブル型（User-Defined Table Type）を取得する機能について、その処理内容、入出力仕様、および実装詳細を記述した機能設計書である。

### 本機能の処理概要

Get-DbaDbUserDefinedTableTypeは、SQL Serverデータベースに定義されているユーザー定義テーブル型を取得するPowerShellコマンドレットである。ユーザー定義テーブル型は、ストアドプロシージャや関数でテーブル値パラメータとして使用されるカスタムデータ型であり、複数行のデータを効率的に渡す際に使用される。

**業務上の目的・背景**：ユーザー定義テーブル型は、バッチ処理やストアドプロシージャへのデータ一括送信において重要な役割を果たす。データベースのスキーマ管理、依存関係の確認、マイグレーション前の影響分析において、これらのオブジェクトを把握することは重要である。本機能は、ユーザー定義テーブル型の監査や文書化を支援する。

**機能の利用シーン**：
- データベースオブジェクトの棚卸し
- スキーマ変更前の依存関係確認
- マイグレーション計画での影響分析
- テーブル型構造の文書化

**主要な処理内容**：
1. Get-DbaDatabaseを使用したデータベースコレクションの取得
2. 各データベースからUserDefinedTableTypesコレクションの取得
3. Typeパラメータによる特定テーブル型の絞り込み
4. システムオブジェクトの除外
5. 各テーブル型へのインスタンス情報の付与と出力

**関連システム・外部連携**：
- Get-DbaDatabase（データベース取得）との連携
- SMO UserDefinedTableTypeオブジェクトの使用

**権限による制御**：データベースオブジェクト情報の参照には、各データベースへのアクセス権限が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 268 | ユーザー定義テーブル型 | 主画面 | ユーザー定義テーブル型の取得 |

## 機能種別

データ取得（SELECT）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | No | 対象のSQL Serverインスタンス。パイプライン入力対応 | 有効なSQL Serverインスタンス名 |
| SqlCredential | PSCredential | No | 接続に使用する代替資格情報 | - |
| Database | object[] | No | 対象データベース名。ワイルドカード対応 | - |
| ExcludeDatabase | object[] | No | 除外するデータベース名 | - |
| Type | string[] | No | 取得するテーブル型名 | - |
| EnableException | switch | No | 例外処理の有効化 | - |

### 入力データソース

- SQL Serverインスタンス（Get-DbaDatabase経由）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverが稼働するコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| Database | string | データベース名 |
| ID | int | テーブル型の一意識別子 |
| Name | string | テーブル型名 |
| Columns | ColumnCollection | 列定義コレクション |
| Owner | string | 所有者（スキーマ） |
| CreateDate | DateTime | 作成日時 |
| IsSystemObject | bool | システムオブジェクトかどうか |
| Version | int | 内部バージョン番号 |

### 出力先

- PowerShellパイプライン（Microsoft.SqlServer.Management.Smo.UserDefinedTableType型）

## 処理フロー

### 処理シーケンス

```
1. パラメータバインディング
   └─ SqlInstance、フィルタ条件の受け取り

2. データベースコレクション取得
   └─ Get-DbaDatabase経由
   └─ Database/ExcludeDatabaseによるフィルタ

3. foreach ($db in $InputObject) ループ
   └─ アクセス不可のDBはスキップ
   └─ UserDefinedTableTypesが0件ならスキップ

4. テーブル型取得とフィルタリング
   └─ $db.UserDefinedTableTypes取得
   └─ Typeパラメータによる絞り込み
   └─ システムオブジェクトを除外

5. 結果の出力
   └─ Add-Memberでインスタンス情報追加
   └─ Select-DefaultViewで既定プロパティ選択
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{SqlInstance指定?}
    B -->|Yes| C[Get-DbaDatabase]
    B -->|No| D[InputObject使用]
    C --> E[InputObjectに設定]
    D --> E
    E --> F{各DBをループ}
    F --> G{IsAccessible?}
    G -->|No| H[Warning: アクセス不可]
    H --> F
    G -->|Yes| I{UDTT.Count > 0?}
    I -->|No| J[Output: UDTTなし]
    J --> F
    I -->|Yes| K{Typeフィルタ?}
    K -->|Yes| L[Name絞り込み]
    K -->|No| M[全UDTT取得]
    L --> N{各UDTTをループ}
    M --> N
    N --> O{IsSystemObject?}
    O -->|Yes| N
    O -->|No| P[Add-Member: インスタンス情報]
    P --> Q[Select-DefaultView]
    Q --> N
    N -->|完了| F
    F -->|完了| R[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | アクセス可能DBのみ | IsAccessibleがfalseのDBは警告を出してスキップ | 常時 |
| BR-002 | 空コレクション処理 | UserDefinedTableTypesが0件の場合はOutputメッセージ | 常時 |
| BR-003 | Typeフィルタ | Typeパラメータで名前が一致するもののみ返却 | Type指定時 |
| BR-004 | システムオブジェクト除外 | IsSystemObject=trueのテーブル型はスキップ | 常時 |

### 計算ロジック

特になし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| テーブル型取得 | sys.table_types | SELECT | SMO経由でUDTT取得 |

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

#### sys.table_types（SMO経由アクセス）

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | name, type_table_object_id, is_user_defined等 | ユーザー定義のみ | SMOのUserDefinedTableTypesコレクション経由 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | アクセス不可 | DBにアクセスできない | Warning出力してスキップ |

### リトライ仕様

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

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

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

## パフォーマンス要件

- Get-DbaDatabaseを経由するため、Database/ExcludeDatabaseでの絞り込みが有効
- テーブル型の数は通常少数のため、処理は高速

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

- 各データベースへのアクセス権限が必要
- スキーマ情報の参照権限が必要

## 備考

- Columnsプロパティで列定義の詳細を確認可能
- システムオブジェクトは自動的に除外される

---

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

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

### 推奨読解順序

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

SMO UserDefinedTableTypeオブジェクトの構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaDbUserDefinedTableType.ps1 | `public/Get-DbaDbUserDefinedTableType.ps1` | 出力型（.OUTPUTS）セクション（47-71行目） |

**読解のコツ**: UserDefinedTableTypeはColumnsプロパティで列定義を持ち、テーブル値パラメータの構造を表す。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaDbUserDefinedTableType.ps1 | `public/Get-DbaDbUserDefinedTableType.ps1` | function宣言とparamブロック（89-98行目） |

**主要処理フロー**:
1. **89-98行目**: パラメータ定義
2. **100行目**: processブロック開始
3. **101-103行目**: SqlInstance指定時はGet-DbaDatabase呼び出し

#### Step 3: フィルタリング処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaDbUserDefinedTableType.ps1 | `public/Get-DbaDbUserDefinedTableType.ps1` | テーブル型取得とフィルタ（105-119行目） |

**主要処理フロー**:
- **106-109行目**: IsAccessibleチェック
- **110-113行目**: UserDefinedTableTypes.Countチェック
- **115-119行目**: Typeパラメータによるフィルタ

#### Step 4: 出力処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Get-DbaDbUserDefinedTableType.ps1 | `public/Get-DbaDbUserDefinedTableType.ps1` | 出力オブジェクト生成（121-134行目） |

**主要処理フロー**:
- **122-124行目**: システムオブジェクトのスキップ
- **126-129行目**: Add-Memberでインスタンス情報追加
- **131行目**: 既定プロパティ定義
- **133行目**: Select-DefaultViewで出力

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

```
Get-DbaDbUserDefinedTableType
    │
    ├─ Get-DbaDatabase
    │      └─ Connect-DbaInstance
    │             └─ SQL Server SMO接続
    │
    ├─ $db.UserDefinedTableTypes
    │      └─ Where-Object（フィルタリング）
    │
    ├─ Add-Member（プロパティ追加）
    │
    └─ Select-DefaultView（出力整形）
```

### データフロー図

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

SqlInstance ───▶ Get-DbaDatabase ───▶ Database[]
                        │
                        ▼
              各 $db.UserDefinedTableTypes
                        │
                        ▼
              Typeフィルタ + IsSystemObject除外
                        │
                        ▼
              Add-Member ───▶ インスタンス情報付与
                        │
                        ▼
              Select-DefaultView ───▶ パイプライン出力
                                             │
                                             ▼
                                UserDefinedTableType Objects
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaDbUserDefinedTableType.ps1 | `public/Get-DbaDbUserDefinedTableType.ps1` | ソース | メイン実装 |
| Get-DbaDatabase.ps1 | `public/Get-DbaDatabase.ps1` | ソース | データベース取得 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続 |
