# 機能設計書 206-Remove-DbaDbData

## 概要

本ドキュメントは、dbatools PowerShellモジュールのRemove-DbaDbData関数の機能設計を定義する。この関数は、指定されたデータベースの全ユーザーテーブルをTRUNCATEして、テーブル構造を保持しながら全データを削除するための機能を提供する。

### 本機能の処理概要

Remove-DbaDbDataは、指定されたデータベース内の全ユーザーテーブルからデータを削除する。外部キーやビューが存在してTRUNCATEが妨げられる場合、関数は自動的にそれらをスクリプト化し、一時的に削除してからTRUNCATEを実行し、その後元の定義と権限で再作成する。

**業務上の目的・背景**：テストや開発環境のリセット、データの初期化、スキーマを再構築せずにデータベースをクリアする必要がある場合に使用される。DELETE操作と比較してTRUNCATEは高速でログ記録が最小限であるため、大量データのクリアに適している。

**機能の利用シーン**：
- 開発・テスト環境のデータリセット
- データベースのクリーンアップ（スキーマは維持）
- パフォーマンステスト前のデータ初期化
- 複数データベースの一括データ削除

**主要な処理内容**：
1. 入力タイプの判定（インスタンス、サーバーオブジェクト、データベースオブジェクト）
2. 対象データベースの取得（システムDBは除外）
3. 外部キーとビューのスクリプト化（Drop/Create）
4. 外部キーとビューの一時削除
5. 全ユーザーテーブルのTRUNCATE実行
6. 外部キーとビューの再作成
7. 一時スクリプトファイルの削除

**関連システム・外部連携**：
- Get-DbaDbForeignKey：外部キー取得
- Get-DbaDbView：ビュー取得
- Export-DbaScript：オブジェクトのスクリプト化
- Invoke-DbaQuery：SQLクエリ実行

**権限による制御**：対象データベースおよびテーブルへの適切な権限が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | 画面機能マッピングに該当なし |

## 機能種別

データ削除（DML操作）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstance[] | No | 対象のSQL Serverインスタンス | - |
| SqlCredential | PSCredential | No | SQL Server認証用の資格情報 | - |
| Database | string[] | No | 対象データベース名 | - |
| ExcludeDatabase | string[] | No | 除外するデータベース名 | - |
| InputObject | object[] | No | パイプラインからの入力（サーバーまたはデータベースオブジェクト） | ValueFromPipeline |
| Path | string | No | 一時スクリプトの保存先パス。デフォルトはdbatools設定値 | - |
| EnableException | switch | No | 例外を直接スローするかどうか | - |

### 入力データソース

- パラメータ入力：SqlInstance、Database
- パイプライン入力：Connect-DbaInstance、Get-DbaDatabaseからのオブジェクト

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| なし | - | このコマンドはパイプラインに出力を返さない |

### 出力先

- SQL Server：ユーザーテーブルのデータ削除
- ファイルシステム：一時スクリプトファイル（処理後削除）

## 処理フロー

### 処理シーケンス

```
1. begin ブロック
   └─ 1.1 エクスポートディレクトリのテスト
2. process ブロック
   └─ 2.1 入力タイプの判定
       └─ DbaInstanceParameter / Server / Database
   └─ 2.2 データベース取得（システムDB除外）
   └─ 2.3 ShouldProcess確認
   └─ 2.4 外部キーとビューの取得
   └─ 2.5 Createスクリプトの生成（権限付き）
   └─ 2.6 Dropスクリプトの生成
   └─ 2.7 Dropスクリプトの実行
   └─ 2.8 全テーブルのTruncateData()実行
   └─ 2.9 Createスクリプトの実行
   └─ 2.10 一時ファイルの削除
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{入力検証}
    B -->|NG| C[Stop-Function]
    C --> Z[終了]
    B -->|OK| D[入力タイプ判定]
    D --> E{データベースループ}
    E -->|次のDB| F{ShouldProcess?}
    F -->|No| E
    F -->|Yes| G[外部キー/ビュー取得]
    G --> H[Createスクリプト生成]
    H --> I[Dropスクリプト生成]
    I --> J[Dropスクリプト実行]
    J --> K[TruncateData実行]
    K --> L{エラー?}
    L -->|Yes| M[Createスクリプト実行]
    L -->|No| N[Createスクリプト実行]
    M --> O[警告出力]
    N --> P[一時ファイル削除]
    O --> P
    P --> E
    E -->|完了| Z
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-206-01 | システムDB除外 | システムデータベースは処理対象から除外 | 常時 |
| BR-206-02 | 依存オブジェクト処理 | 外部キーとビューを一時削除してTRUNCATE後に再作成 | 外部キー/ビュー存在時 |
| BR-206-03 | 権限保持 | 再作成時に元の権限を復元 | 常時 |
| BR-206-04 | 確認プロンプト | ConfirmImpact=Highで実行前に確認を求める | Confirm未指定時 |
| BR-206-05 | エラー時復元 | TRUNCATEでエラー発生時も依存オブジェクトの再作成を試行 | エラー発生時 |

### 計算ロジック

特になし

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

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

| 操作 | 対象 | 操作種別 | 概要 |
|-----|-----|---------|------|
| 外部キー削除 | 外部キー制約 | DDL (DROP) | 一時的に削除 |
| ビュー削除 | ビュー | DDL (DROP) | 一時的に削除 |
| テーブルTRUNCATE | 全ユーザーテーブル | DML (TRUNCATE) | データ削除 |
| 外部キー再作成 | 外部キー制約 | DDL (CREATE) | 権限付きで復元 |
| ビュー再作成 | ビュー | DDL (CREATE) | 権限付きで復元 |

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

#### 全ユーザーテーブル

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| TRUNCATE | 全データ | $_.TruncateData() | SMOメソッド使用 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| InputError | 入力エラー | パイプライン/SqlInstance未指定 | いずれかを指定 |
| ScriptError | スクリプトエラー | Drop/Createスクリプト生成失敗 | エラー詳細を確認 |
| TruncateError | 実行エラー | TRUNCATEの失敗 | 依存オブジェクトを確認 |
| FileError | ファイルエラー | 一時ファイル削除失敗 | 手動で削除 |

### リトライ仕様

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

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

各操作は独立して実行。TRUNCATE失敗時も依存オブジェクトの再作成を試行。

## パフォーマンス要件

- TRUNCATEはDELETEより高速（最小限のログ記録）
- 大量の外部キー/ビューがある場合はスクリプト生成に時間がかかる可能性

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

- 対象データベース/テーブルへの適切な権限が必要
- ConfirmImpact=Highによる誤操作防止
- 一時スクリプトファイルには注意が必要

## 備考

- Jess Pomfret (@jpomfret) により作成
- 外部キーとビューの順序は依存関係を考慮

---

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

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

### 推奨読解順序

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

SMOのテーブルオブジェクトとTruncateData()メソッドを理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Microsoft.SqlServer.Management.Smo.Table | SMO | TruncateData()メソッド |

**読解のコツ**: TruncateData()はSMOのTableオブジェクトのメソッドで、TRUNCATE TABLE文を実行する。外部キー参照がある場合は失敗するため、事前に削除が必要。

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

Remove-DbaDbData.ps1の構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Remove-DbaDbData.ps1 | `public/Remove-DbaDbData.ps1` | 関数全体の処理フロー |

**主要処理フロー**:
1. **96-98行目**: begin ブロック（エクスポートディレクトリテスト）
2. **111-130行目**: 入力タイプ判定とデータベース取得
3. **137-153行目**: 外部キー/ビューのスクリプト化
4. **159-168行目**: Drop実行、TRUNCATE、Create実行
5. **173-179行目**: 一時ファイル削除

#### Step 3: 関連機能を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaDbForeignKey.ps1 | `public/Get-DbaDbForeignKey.ps1` | 外部キー取得 |
| 3-2 | Get-DbaDbView.ps1 | `public/Get-DbaDbView.ps1` | ビュー取得 |
| 3-3 | Export-DbaScript.ps1 | `public/Export-DbaScript.ps1` | スクリプト生成 |
| 3-4 | New-DbaScriptingOption.ps1 | `public/New-DbaScriptingOption.ps1` | スクリプトオプション |

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

```
Remove-DbaDbData
    │
    ├─ Test-ExportDirectory
    │      └─ エクスポートパス検証
    │
    ├─ Get-DbaDatabase
    │      └─ データベース取得
    │
    ├─ Get-DbaDbForeignKey
    │      └─ 外部キー取得
    │
    ├─ Get-DbaDbView
    │      └─ ビュー取得（システムビュー除外）
    │
    ├─ New-DbaScriptingOption
    │      └─ スクリプトオプション作成
    │
    ├─ Export-DbaScript
    │      └─ Create/Dropスクリプト生成
    │
    ├─ Invoke-DbaQuery
    │      └─ Drop/Createスクリプト実行
    │
    ├─ $db.Tables.TruncateData()
    │      └─ テーブルデータ削除
    │
    └─ Remove-Item
           └─ 一時ファイル削除
```

### データフロー図

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

SqlInstance ─────────▶ Get-DbaDatabase
    │                        │
Database ────────────▶ システムDB除外
    │                        │
InputObject ─────────▶ 外部キー/ビュー取得
                             │
                             ▼
                    ┌─────────────────────┐
                    │ 一時ファイル        │
                    │ - {DB}_Create.Sql   │
                    │ - {DB}_Drop.Sql     │
                    └─────────────────────┘
                             │
                             ▼
                    ┌─────────────────────┐
                    │ 1. Dropスクリプト実行│
                    │ 2. TruncateData()   │
                    │ 3. Createスクリプト  │
                    └─────────────────────┘
                             │
                             ▼
                    一時ファイル削除 ────────▶ ファイルシステム
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Remove-DbaDbData.ps1 | `public/Remove-DbaDbData.ps1` | ソース | メイン関数実装 |
| Get-DbaDbForeignKey.ps1 | `public/Get-DbaDbForeignKey.ps1` | ソース | 外部キー取得 |
| Get-DbaDbView.ps1 | `public/Get-DbaDbView.ps1` | ソース | ビュー取得 |
| Export-DbaScript.ps1 | `public/Export-DbaScript.ps1` | ソース | スクリプト生成 |
| New-DbaScriptingOption.ps1 | `public/New-DbaScriptingOption.ps1` | ソース | スクリプトオプション |
| Invoke-DbaQuery.ps1 | `public/Invoke-DbaQuery.ps1` | ソース | クエリ実行 |
