# 機能設計書 670-Get-DbaDbTable

## 概要

本ドキュメントは、SQL Serverデータベースからテーブルメタデータ（スペース使用量、行数、テーブル機能を含む）を取得するGet-DbaDbTable機能の設計仕様を記述したものである。

### 本機能の処理概要

Get-DbaDbTableは、行数、スペース使用量（IndexSpaceUsed、DataSpaceUsed）、およびメモリ最適化、パーティション化、FileTableステータスなどの特殊なテーブル特性を含む詳細なテーブル情報を返す機能である。

**業務上の目的・背景**：データベースの容量計画、ドキュメント作成、および複数のデータベースにわたって特定の機能を持つテーブルを見つけるために不可欠である。特殊文字を含む複雑な3部名前をサポートし、データベース、スキーマ、または特定のテーブル名でフィルタリングできる。

**機能の利用シーン**：
- データベース容量監視とレポーティング
- テーブルサイズ分析
- パーティションテーブルの検出
- メモリ最適化テーブルの調査
- グラフデータベーステーブル（Node/Edge）の識別
- FileTableの管理

**主要な処理内容**：
1. 対象データベースの取得
2. SMOによるテーブルメタデータの効率的な一括取得（ClearAndInitialize）
3. 名前、スキーマによるフィルタリング
4. SQL Serverバージョンに応じたプロパティの動的取得
5. 結果オブジェクトへのメタデータ付加とパイプライン出力

**関連システム・外部連携**：SQL Server Management Objects (SMO)を使用してSQL Serverと連携し、テーブルのメタデータを取得する。

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

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | PowerShellコンソール | 主画面 | コマンド実行とテキスト出力表示 |

## 機能種別

データ参照（SELECT） / メタデータ取得

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | No | 対象SQL Serverインスタンス | - |
| SqlCredential | PSCredential | No | 代替認証情報 | Windows/SQL/AD認証対応 |
| Database | string[] | No | 検索対象データベース | ワイルドカード対応 |
| ExcludeDatabase | string[] | No | 除外するデータベース | ワイルドカード対応 |
| IncludeSystemDBs | switch | No | システムDBを含める | デフォルト: 除外 |
| Table | string[] | No | 取得するテーブル名 | 1部/2部/3部名前対応 |
| Schema | string[] | No | フィルタ対象スキーマ | 複数指定可能 |
| InputObject | Database[] | No | データベースオブジェクト | パイプライン入力可能 |
| EnableException | switch | No | 例外を有効化 | - |

### 入力データソース

- SqlInstance: パイプラインまたはパラメータから取得
- InputObject: Get-DbaDatabase等からパイプライン入力
- Table: テーブル名の解析にGet-ObjectNameParts内部関数を使用

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverのコンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全修飾インスタンス名 |
| Database | string | データベース名 |
| Schema | string | スキーマ名 |
| Name | string | テーブル名 |
| IndexSpaceUsed | double | インデックス使用スペース(KB) |
| DataSpaceUsed | double | データ使用スペース(KB) |
| RowCount | long | 行数 |
| HasClusteredIndex | bool | クラスタードインデックス有無 |
| IsPartitioned | bool | パーティション化（SQL 2005+） |
| ChangeTrackingEnabled | bool | 変更追跡有効（SQL 2008+） |
| IsFileTable | bool | FileTable（SQL 2012+） |
| IsMemoryOptimized | bool | メモリ最適化（SQL 2014+） |
| IsNode | bool | グラフノード（SQL 2017+） |
| IsEdge | bool | グラフエッジ（SQL 2017+） |
| FullTextIndex | object | フルテキストインデックス |

### 出力先

パイプライン出力（Microsoft.SqlServer.Management.Smo.Table型オブジェクト）

## 処理フロー

### 処理シーケンス

```
1. 入力パラメータの検証
   └─ Tableパラメータの解析（Get-ObjectNameParts使用）
2. データベースオブジェクトの取得
   └─ SqlInstance指定時はGet-DbaDatabase呼び出し
3. 各データベースの処理ループ
   └─ バージョンに応じたプロパティリスト構築
4. SMOによるテーブル一括取得
   └─ ClearAndInitialize with URN filter（設定有効時）
5. フィルタリング処理
   └─ 名前、スキーマによるフィルタリング
6. 結果オブジェクトの構築と出力
   └─ NoteProperty追加とデフォルトビュー設定
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{Table指定あり?}
    B -->|Yes| C[Get-ObjectNamePartsで解析]
    B -->|No| D[全テーブル対象]
    C --> E{解析成功?}
    E -->|No| F[警告出力]
    E -->|Yes| G[fqTns配列に追加]
    D --> H[データベース取得]
    G --> H
    F --> H
    H --> I[各DBループ開始]
    I --> J[バージョン別プロパティ構築]
    J --> K{URNフィルタ構築?}
    K -->|Yes| L[フィルタ条件作成]
    K -->|No| M[ClearAndInitialize実行]
    L --> M
    M --> N[テーブルフィルタリング]
    N --> O[結果出力]
    O --> P{次のDB?}
    P -->|Yes| I
    P -->|No| Q[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-670-1 | システムDB除外 | デフォルトでシステムDBは除外 | IncludeSystemDBs未指定時 |
| BR-670-2 | アクセス可能DB限定 | IsAccessibleのDBのみ処理 | 常時 |
| BR-670-3 | バージョン別プロパティ | SQL Serverバージョンに応じたプロパティを取得 | 常時 |
| BR-670-4 | 3部名前DB一致 | 3部名前指定時、DB名が一致しない場合はスキップ | Table指定時 |
| BR-670-5 | URNフィルタ最適化 | config設定有効時、サーバー側でフィルタリング | clearandinitialize設定時 |

### 計算ロジック

**バージョン別プロパティ**:
- SQL 2005+ (Version 9+): IsPartitioned
- SQL 2008+ (Version 10+): ChangeTrackingEnabled
- SQL 2012+ (Version 11+): IsFileTable
- SQL 2014+ (Version 12+): IsMemoryOptimized
- SQL 2017+ (Version 14+): IsNode, IsEdge

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 取得 | sys.tables (SMO経由) | SELECT | テーブルメタデータ取得 |

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

#### sys.tables (SMO経由)

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | Schema, Name, IndexSpaceUsed, DataSpaceUsed, RowCount, HasClusteredIndex, 他 | 全件または指定条件 | ClearAndInitializeで効率取得 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | Warning | テーブル名解析失敗 | 警告メッセージ出力後継続 |
| - | Stop | 有効なテーブル名なし | Stop-Function実行 |
| - | Verbose | テーブル未発見 | Verboseメッセージ出力 |

### リトライ仕様

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

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

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

## パフォーマンス要件

- ClearAndInitializeメソッドで必要なプロパティのみを1クエリで一括取得
- URNフィルタでサーバー側フィルタリング（config設定時）
- バージョン別プロパティにより不要なプロパティ取得を回避

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

- SqlCredentialパラメータで認証情報を安全に受け渡し
- Windows認証、SQL認証、AD認証に対応
- MFAサポートはConnect-DbaInstance経由で利用可能

## 備考

- Copy-DbaDbTableData等と連携してテーブルデータ操作が可能
- SMOのTableオブジェクトをそのまま返すため、追加のプロパティもSelect-Object *で参照可能
- FullTextIndexは複雑なオブジェクトで、ClearAndInitializeでは初期化されないがデフォルト表示に含まれる

---

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

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

### 推奨読解順序

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

SMOのTableオブジェクトとバージョン別プロパティを理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaDbTable.ps1 | `public/Get-DbaDbTable.ps1` | バージョン別プロパティリスト構築 |

**読解のコツ**: 184-210行目でSQL Serverバージョンに応じてプロパティリストを動的構築している。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaDbTable.ps1 | `public/Get-DbaDbTable.ps1` | メイン処理の流れを把握 |

**主要処理フロー**:
1. **145-167行目**: beginブロックでTable解析処理
2. **172-174行目**: SqlInstance指定時のデータベース取得
3. **184-210行目**: バージョン別プロパティリスト構築
4. **212-279行目**: URNフィルタ構築（config有効時）
5. **281行目**: ClearAndInitialize実行
6. **283-303行目**: テーブルフィルタリング
7. **309-339行目**: NoteProperty追加とデフォルトビュー出力

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-ObjectNameParts | `internal/functions/` | オブジェクト名解析 |
| 3-2 | Get-DbaDatabase | `public/Get-DbaDatabase.ps1` | データベース取得処理 |
| 3-3 | Get-DbatoolsConfigValue | `internal/functions/` | 設定値取得 |

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

```
Get-DbaDbTable
    │
    ├─ Get-ObjectNameParts (Table解析)
    │
    ├─ Get-DbaDatabase (DB取得)
    │      └─ Connect-DbaInstance
    │
    ├─ バージョン別プロパティ構築
    │      ├─ VersionMajor >= 9: IsPartitioned
    │      ├─ VersionMajor >= 10: ChangeTrackingEnabled
    │      ├─ VersionMajor >= 11: IsFileTable
    │      ├─ VersionMajor >= 12: IsMemoryOptimized
    │      └─ VersionMajor >= 14: IsNode, IsEdge
    │
    ├─ Get-DbatoolsConfigValue (URNフィルタ設定)
    │
    ├─ $db.Tables.ClearAndInitialize (SMO一括取得)
    │
    ├─ Add-Member (プロパティ追加)
    │
    └─ Select-DefaultView (出力フォーマット)
```

### データフロー図

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

SqlInstance ───────────┐
                       │
SqlCredential ─────────┼──▶ Get-DbaDatabase ───────▶ Database[]
                       │
Database ──────────────┤
                       │
ExcludeDatabase ───────┤
                       │
IncludeSystemDBs ──────┘
                              │
                              ▼
Table ─────────────────────▶ Get-ObjectNameParts ───▶ fqTns[]
                              │
Schema ────────────────────▶ │
                              │
InputObject ───────────────▶ │
                              ▼
                        バージョン別プロパティ構築
                              │
                              ▼
                        ClearAndInitialize
                        (URNフィルタ付き)
                              │
                              ▼
                        フィルタリング処理
                              │
                              ▼
                        Add-Member ─────────────────▶ 拡張Table
                              │
                              ▼
                        Select-DefaultView ────────▶ パイプライン出力
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaDbTable.ps1 | `public/Get-DbaDbTable.ps1` | ソース | メイン機能実装 |
| Get-DbaDatabase.ps1 | `public/Get-DbaDatabase.ps1` | ソース | データベース取得 |
| Get-ObjectNameParts.ps1 | `internal/functions/` | ソース | オブジェクト名解析 |
| Select-DefaultView.ps1 | `internal/functions/` | ソース | 出力フォーマット |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | 接続確立 |
| Copy-DbaDbTableData.ps1 | `public/Copy-DbaDbTableData.ps1` | ソース | テーブルデータコピー（関連機能） |
| Export-DbaDbTableData.ps1 | `public/Export-DbaDbTableData.ps1` | ソース | テーブルデータエクスポート（関連機能） |
