# 機能設計書 672-Remove-DbaDbTable

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおける `Remove-DbaDbTable` コマンドレットの機能設計を記載する。この機能はSQL Serverデータベースからテーブルを安全に削除するための機能を提供する。

### 本機能の処理概要

**業務上の目的・背景**：データベース管理において、不要になったテーブルや一時的なテーブルを削除する必要が発生する。手動でDROP TABLE文を実行する代わりに、PowerShellからの一括削除操作、確認プロンプト付きの安全な削除、詳細なステータスレポートを提供することで、運用ミスを防ぎながら効率的なテーブル管理を実現する。

**機能の利用シーン**：
- 開発・テスト環境のクリーンアップ時に複数のテーブルを一括削除
- データベース移行後の不要テーブルの整理
- 一時テーブルやワークテーブルの定期的なパージ処理
- Get-DbaDbTableでフィルタリングした特定条件のテーブルをパイプラインで削除

**主要な処理内容**：
1. SQL Serverインスタンスへの接続（SqlInstance指定時）
2. 対象テーブルの取得（Get-DbaDbTable経由またはパイプライン入力）
3. ShouldProcess確認プロンプトの表示（ConfirmImpact: High）
4. SMO Drop()メソッドによるテーブル削除
5. 削除結果のステータスオブジェクト生成と出力

**関連システム・外部連携**：SQL Server Management Objects (SMO)ライブラリを使用してSQL Serverと通信。

**権限による制御**：対象テーブルへのDROP権限、またはデータベースのdb_ddladmin/db_owner権限が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | コマンドライン | 主画面 | PowerShellコンソールまたはスクリプトから実行 |

## 機能種別

CRUD操作（Delete）/ DDL操作

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | No | 接続先SQL Serverインスタンス | 有効なインスタンス名 |
| SqlCredential | PSCredential | No | 代替認証情報 | 有効な資格情報 |
| Database | String[] | No | 対象データベース | 存在するデータベース名 |
| Table | String[] | No | 削除対象テーブル名（Alias: Name） | 有効なテーブル名 |
| InputObject | Table[] | No | パイプライン入力用SMOテーブルオブジェクト | Microsoft.SqlServer.Management.Smo.Table |
| EnableException | Switch | No | 例外有効化 | - |

### 入力データソース

- PowerShellコマンドラインパラメータ
- パイプライン入力（Get-DbaDbTable経由）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | String | SQL Serverコンピュータ名 |
| InstanceName | String | インスタンス名 |
| SqlInstance | String | 完全修飾インスタンス名 |
| Database | String | データベース名 |
| Table | String | テーブル完全修飾名（schema.name） |
| TableName | String | テーブル名（スキーマなし） |
| TableSchema | String | スキーマ名 |
| Status | String | 削除結果（Dropped/エラーメッセージ） |
| IsRemoved | Boolean | 削除成功フラグ |

### 出力先

- PowerShellパイプライン（PSCustomObject）

## 処理フロー

### 処理シーケンス

```
1. パラメータバリデーション
   └─ SqlInstanceまたはInputObjectの指定確認
2. begin{}ブロック
   └─ $tables配列の初期化
3. process{}ブロック
   └─ SqlInstance指定時: Get-DbaDbTableで$tablesに追加
   └─ InputObject指定時: $tablesに追加
4. end{}ブロック
   └─ 各テーブルに対してループ処理
       └─ ShouldProcess確認
       └─ Drop()実行
       └─ ステータスオブジェクト生成・出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{SqlInstance or InputObject?}
    B -->|なし| C[エラー終了]
    B -->|SqlInstance| D[Get-DbaDbTable]
    B -->|InputObject| E[InputObjectを$tablesに追加]
    D --> F[$tablesに追加]
    F --> G[end{}ブロック開始]
    E --> G
    G --> H[各テーブルループ]
    H --> I{ShouldProcess確認}
    I -->|No| J[スキップ]
    I -->|Yes| K[Drop実行]
    K --> L{成功?}
    L -->|Yes| M[Status=Dropped, IsRemoved=true]
    L -->|No| N[Status=エラー, IsRemoved=false]
    M --> O[ステータス出力]
    N --> O
    O --> H
    J --> H
    H -->|完了| P[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | 入力必須 | SqlInstanceまたはInputObjectのいずれかが必須 | コマンド実行時 |
| BR-002 | 高確認レベル | ConfirmImpact=Highで確認プロンプト表示 | デフォルト動作 |
| BR-003 | end{}での削除 | パイプラインからの入力完了後にend{}で削除実行 | コレクション変更エラー防止 |

### 計算ロジック

特になし。

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| テーブル削除 | 指定テーブル | DROP TABLE | テーブル完全削除 |

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

#### 指定テーブル

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| DROP TABLE | - | SMO Drop()メソッド | テーブル全体を削除 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 接続エラー | SQL Serverに接続できない | 接続情報確認 |
| - | 権限エラー | DROP権限不足 | 権限付与 |
| - | 依存関係エラー | 外部キー制約等が存在 | 依存関係解除後に再実行 |
| - | パラメータエラー | SqlInstance/InputObject未指定 | パラメータ指定 |

### リトライ仕様

エラー発生時のリトライは実装されていない。個々のテーブル削除失敗時もIsRemoved=falseで継続処理。

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

SMOのDrop()メソッドを使用するため、各テーブル削除は個別のDDL操作として実行される。複数テーブル削除時に一部失敗しても他のテーブルへの影響はない。

## パフォーマンス要件

特定のパフォーマンス要件なし。end{}ブロックでの一括処理により、パイプライン入力時のコレクション変更エラーを防止。

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

- SqlCredentialパラメータで資格情報を安全に渡すことが可能
- ConfirmImpact=Highにより誤操作防止
- -Confirm:$falseで確認スキップ可能（スクリプト自動化用）

## 備考

- Get-DbaDbTableと組み合わせて使用することで、柔軟なフィルタリングが可能
- 複数インスタンス・複数データベースへの一括操作をサポート

---

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

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

### 推奨読解順序

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

出力されるPSCustomObjectの構造を確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Remove-DbaDbTable.ps1 | `public/Remove-DbaDbTable.ps1` | 115-125行目: 出力オブジェクトの構造定義 |

**読解のコツ**: PowerShellのPSCustomObjectはハッシュテーブルから生成される柔軟なオブジェクト。

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

begin/process/endの3フェーズ構造を確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Remove-DbaDbTable.ps1 | `public/Remove-DbaDbTable.ps1` | 92-109行目: begin/processブロック |

**主要処理フロー**:
1. **92-94行目**: begin{}で$tables配列初期化
2. **96-109行目**: process{}でテーブルオブジェクト収集

#### Step 3: 削除ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Remove-DbaDbTable.ps1 | `public/Remove-DbaDbTable.ps1` | 111-138行目: end{}ブロックでの削除処理 |

**主要処理フロー**:
- **113行目**: foreachループ開始
- **114行目**: ShouldProcess確認
- **115-125行目**: ステータスオブジェクト初期化
- **126-134行目**: Drop()実行とエラーハンドリング
- **135行目**: ステータスオブジェクト出力

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

```
Remove-DbaDbTable
    │
    ├─ [begin] 初期化
    │
    ├─ [process] テーブル収集
    │      └─ Get-DbaDbTable (SqlInstance指定時)
    │             └─ Connect-DbaInstance
    │
    └─ [end] 削除実行
           └─ $table.Drop() (SMO)
           └─ Get-ErrorMessage (エラー時)
```

### データフロー図

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

SqlInstance ─────────────────┐
Database ────────────────────┼──▶ Get-DbaDbTable ──▶ $tables[]
Table ───────────────────────┘

    または

InputObject ─────────────────────▶ $tables[]

                                         │
                                         ▼
                              [end{}ブロック]
                                         │
                              ┌──────────┴──────────┐
                              ▼                      ▼
                        ShouldProcess            スキップ
                              │
                              ▼
                         Drop()実行
                              │
                              ▼
                       PSCustomObject
                              │
                              ▼
                         パイプライン出力
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Remove-DbaDbTable.ps1 | `public/Remove-DbaDbTable.ps1` | ソース | メイン機能実装 |
| Get-DbaDbTable.ps1 | `public/Get-DbaDbTable.ps1` | ソース | テーブル取得 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | 接続処理 |
| Remove-DbaDbTable.Tests.ps1 | `tests/Remove-DbaDbTable.Tests.ps1` | テスト | 単体テスト |
