# 機能設計書 683-Remove-DbaDbView

## 概要

本ドキュメントは、dbatools PowerShellモジュールの `Remove-DbaDbView` コマンドレットに関する機能設計書です。SQL Serverデータベースからビューを削除するための機能を提供します。

### 本機能の処理概要

**業務上の目的・背景**：データベースのリファクタリング、開発環境のクリーンアップ、または古くなったビューの整理など、ビューを一括または個別に削除する必要がある場面が存在します。手動でSSMSから削除する作業を自動化し、複数インスタンス・複数データベースにわたる削除作業を効率化します。

**機能の利用シーン**：
- データベースリファクタリング時に不要なビューを削除する場合
- 開発環境のクリーンアップ作業
- スキーマ変更に伴う古いビューの一括削除
- CI/CDパイプラインでのテストデータベースリセット

**主要な処理内容**：
1. 対象ビューの特定（名前指定またはパイプライン入力）
2. ShouldProcessによる確認プロンプト表示
3. SMO Drop()メソッドによるビュー削除
4. 削除結果の出力

**関連システム・外部連携**：SQL Server Management Objects (SMO) を使用してSQL Serverインスタンスと通信し、ビューを削除します。

**権限による制御**：ビューを削除するためには、ALTER権限またはビュー所有者権限が必要です。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 42 | ビュー管理 | 主機能 | ビューの削除 |

## 機能種別

データ削除（ビューオブジェクトの削除）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | Yes(NonPipeline) | 対象SQL Serverインスタンス | Position 0 |
| SqlCredential | PSCredential | No | 代替認証情報 | Windows/SQL/AD認証対応 |
| Database | string[] | No | 対象データベース | 複数指定可能 |
| View | string[] | No | 削除するビュー名 | ワイルドカード対応 |
| InputObject | SMO.View[] | Yes(Pipeline) | ビューオブジェクト | パイプライン入力 |
| EnableException | switch | No | 例外を有効化 | デフォルト: $false |
| WhatIf | switch | No | 変更プレビュー | SupportsShouldProcess |
| Confirm | switch | No | 確認プロンプト | デフォルト: $true |

### 入力データソース

- 直接パラメータ指定: SqlInstance + Database + View
- パイプライン入力: Get-DbaDbView からの SMO View オブジェクト

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全インスタンス名 |
| Database | string | データベース名 |
| View | string | スキーマ.ビュー名形式 |
| ViewName | string | ビュー名のみ |
| ViewSchema | string | スキーマ名 |
| Status | string | 削除結果（Dropped/エラーメッセージ） |
| IsRemoved | bool | 削除成功可否 |

### 出力先

PowerShellパイプライン（PSCustomObject）

## 処理フロー

### 処理シーケンス

```
1. 初期化（begin）
   └─ 空のビュー配列を初期化
2. ビュー収集（process）
   └─ SqlInstance指定時: Get-DbaDbViewで取得
   └─ パイプライン: InputObjectに追加
3. 削除実行（end）
   └─ 各ビューに対してShouldProcess確認
   └─ Drop()メソッド実行
   └─ 結果オブジェクト出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[begin: views配列初期化]
    B --> C{process: SqlInstance指定?}
    C -->|Yes| D[Get-DbaDbView呼び出し]
    C -->|No| E[InputObjectを配列に追加]
    D --> F[views配列に格納]
    E --> F
    F --> G[end: 各ビューをループ]
    G --> H{ShouldProcess?}
    H -->|No| I[スキップ]
    H -->|Yes| J[結果オブジェクト作成]
    J --> K[Drop実行を試行]
    K --> L{成功?}
    L -->|Yes| M[Status="Dropped", IsRemoved=$true]
    L -->|No| N[Stop-Function呼び出し]
    N --> O[Status=エラーメッセージ, IsRemoved=$false]
    M --> P[結果出力]
    O --> P
    I --> G
    P --> G
    G -->|完了| Q[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | 確認プロンプト | デフォルトでConfirm=$trueによる確認 | 常時 |
| BR-002 | HighImpact | ConfirmImpact='High'による高リスク操作扱い | 常時 |
| BR-003 | パラメータセット | NonPipelineとPipelineの排他パラメータセット | 常時 |
| BR-004 | 遅延削除 | endブロックで削除実行（コレクション変更回避） | 常時 |

### 計算ロジック

なし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| ビュー削除 | 対象ビュー | DROP VIEW | SMO Drop()メソッドによる削除 |

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

#### 対象ビュー

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| DROP | ビューオブジェクト | - | SMO View.Drop()メソッド |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| DropError | 削除エラー | Drop()メソッド失敗 | Stop-Functionでエラー出力、IsRemoved=$false |

### リトライ仕様

リトライ処理なし

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

SMO Drop()メソッドは即時コミットされる（トランザクション制御はSQL Serverに委任）

## パフォーマンス要件

- endブロックで一括処理することで、パイプライン列挙中のコレクション変更エラーを回避
- 大量削除時はバッチ処理を検討

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

- ALTER権限またはビュー所有者権限が必要
- ShouldProcessによる確認プロンプトで誤削除を防止
- ConfirmImpact='High'により高リスク操作として扱われる

## 備考

- Get-DbaDbViewからパイプラインで渡す使用パターンが推奨される
- WhatIfパラメータで削除対象を事前確認可能

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Remove-DbaDbView.ps1 | `public/Remove-DbaDbView.ps1` | 出力されるPSCustomObjectの構造（114-124行目） |

**読解のコツ**: ShouldProcess内で結果オブジェクトを作成し、try/catchで成功・失敗を判定している。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Remove-DbaDbView.ps1 | `public/Remove-DbaDbView.ps1` | CmdletBindingとパラメータセット（79-93行目） |

**主要処理フロー**:
1. **79行目**: `SupportsShouldProcess, ConfirmImpact = 'High'` - 高リスク操作設定
2. **95-97行目**: beginブロックで空の配列初期化
3. **99-107行目**: processブロックでビューを収集
4. **110-136行目**: endブロックで実際の削除を実行

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Remove-DbaDbView.ps1 | `public/Remove-DbaDbView.ps1` | Drop実行とエラーハンドリング（112-134行目） |

**主要処理フロー**:
- **111行目**: endブロックのコメント説明（コレクション変更回避の理由）
- **113行目**: ShouldProcessによる確認
- **126行目**: `$viewItem.Drop()` - 実際の削除実行
- **129-132行目**: エラー時のStop-Functionとステータス設定

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

```
Remove-DbaDbView
    │
    ├─ Get-DbaDbView（process、SqlInstance指定時）
    │      └─ ビューオブジェクト取得
    │
    ├─ ShouldProcess（end）
    │      └─ 確認プロンプト表示
    │
    ├─ $viewItem.Drop()（end）
    │      └─ SMOによるビュー削除
    │
    ├─ Stop-Function（エラー時）
    │      └─ エラーメッセージ出力
    │
    └─ Get-ErrorMessage（エラー時）
           └─ エラーメッセージ取得
```

### データフロー図

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

SqlInstance + View ──▶ Get-DbaDbView ─────────▶ View[]
      │ or                │
InputObject ─────────────▶ views配列に蓄積
                           │
views[] ─────────────────▶ ShouldProcess確認 ──▶ 確認プロンプト
                           │
View ────────────────────▶ Drop() ─────────────▶ 削除実行
                           │
結果 ────────────────────▶ PSCustomObject ─────▶ 出力
                                                 (Status, IsRemoved)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Remove-DbaDbView.ps1 | `public/Remove-DbaDbView.ps1` | ソース | メイン機能実装 |
| Get-DbaDbView.ps1 | `public/Get-DbaDbView.ps1` | ソース | ビュー取得（内部呼び出し） |
| Stop-Function.ps1 | `internal/functions/Stop-Function.ps1` | ソース | エラー処理ユーティリティ |
| Get-ErrorMessage.ps1 | `internal/functions/Get-ErrorMessage.ps1` | ソース | エラーメッセージ取得 |
