# 画面設計書：42-ビュー管理

## 1. 基本情報

| 項目 | 内容 |
|------|------|
| 画面ID | 42 |
| 画面名 | ビュー管理 |
| カテゴリ | Database |
| 対応コマンド | Get-DbaDbView, Remove-DbaDbView, Find-DbaView, Copy-DbaDbViewData |
| 主テンプレートファイル | public/Get-DbaDbView.ps1 |
| 説明 | SQL Serverデータベースのビューの取得・削除・検索、およびビューデータのコピー機能を提供 |

## 2. 画面概要

ビュー管理画面は、SQL Serverデータベース内のビューオブジェクトを管理するためのコマンド群を提供します。ビューのメタデータ取得、パターン検索による定義の調査、不要ビューの削除、およびビューからデータを高速にコピーする機能を含みます。

### 2.1 主要機能

| 機能No | コマンド名 | 機能種別 | 説明 |
|--------|------------|----------|------|
| 682 | Get-DbaDbView | 主機能 | ビューのメタデータ取得 |
| 683 | Remove-DbaDbView | 主機能 | ビューの削除 |
| 681 | Find-DbaView | 補助機能 | ビュー定義内のパターン検索 |
| 680 | Copy-DbaDbViewData | 補助機能 | ビューデータのバルクコピー |

## 3. 機能詳細

### 3.1 Get-DbaDbView

#### 目的
SQL Serverデータベースからビューオブジェクトとそのメタデータを取得します。スキーマ、作成日、最終更新日などの詳細情報を含みます。

#### パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|--------------|------|
| SqlInstance | DbaInstanceParameter[] | No | - | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | - | 代替認証情報 |
| Database | object[] | No | - | 対象データベース |
| ExcludeDatabase | object[] | No | - | 除外するデータベース |
| ExcludeSystemView | switch | No | - | システムビューを除外 |
| View | string[] | No | - | 特定のビュー名（3パート名対応） |
| Schema | string[] | No | - | 対象スキーマ |
| InputObject | Database[] | No | - | パイプライン入力用 |
| EnableException | switch | No | - | 例外を有効化 |

#### 出力

| 出力型 | 説明 |
|--------|------|
| Microsoft.SqlServer.Management.Smo.View | SMOビューオブジェクト |

#### デフォルト表示プロパティ

- ComputerName
- InstanceName
- SqlInstance
- Database
- Schema
- CreateDate
- DateLastModified
- Name

#### 処理フロー

1. SqlInstance指定時、Get-DbaDatabase経由でデータベースオブジェクト取得
2. 各データベースのViews.ClearAndInitialize()でプロパティ一括読み込み
3. View指定時、3パート名（database.schema.view）をパース
4. Schema指定時、該当スキーマのビューのみフィルタ
5. ExcludeSystemView指定時、IsSystemObject = falseのビューのみ
6. カスタムプロパティ（ComputerName等）を追加して出力

### 3.2 Remove-DbaDbView

#### 目的
データベースからビューオブジェクトを削除します。パイプライン入力に対応し、一括削除が可能です。

#### パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|--------------|------|
| SqlInstance | DbaInstanceParameter[] | Yes(NonPipeline) | - | 対象インスタンス |
| SqlCredential | PSCredential | No | - | 代替認証情報 |
| Database | string[] | No | - | 対象データベース |
| View | string[] | No | - | 削除対象ビュー名 |
| InputObject | View[] | Yes(Pipeline) | - | パイプライン入力 |
| EnableException | switch | No | - | 例外を有効化 |

#### 出力

| プロパティ | 型 | 説明 |
|-----------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全インスタンス名 |
| Database | string | データベース名 |
| View | string | スキーマ.ビュー名 |
| ViewName | string | ビュー名のみ |
| ViewSchema | string | スキーマ名 |
| Status | string | "Dropped" または エラーメッセージ |
| IsRemoved | bool | 削除成功フラグ |

#### 処理フロー

1. beginブロックで空の配列を初期化
2. processブロックでGet-DbaDbView経由またはInputObjectからビュー収集
3. endブロックで実際のDrop()実行（コレクション変更問題回避）
4. ShouldProcess確認後、Drop()メソッド呼び出し
5. 成功/失敗結果をPSCustomObjectで出力

### 3.3 Find-DbaView

#### 目的
ビュー定義（TextBody）内で特定のパターン（正規表現）を検索し、一致したビューと行番号を返します。

#### パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|--------------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | - | 対象インスタンス |
| SqlCredential | PSCredential | No | - | 代替認証情報 |
| Database | object[] | No | - | 対象データベース |
| ExcludeDatabase | object[] | No | - | 除外データベース |
| Pattern | string | Yes | - | 検索パターン（正規表現） |
| IncludeSystemObjects | switch | No | - | システムビューを含める |
| IncludeSystemDatabases | switch | No | - | システムデータベースを含める |
| EnableException | switch | No | - | 例外を有効化 |

#### 出力

| プロパティ | 型 | 説明 |
|-----------|-----|------|
| ComputerName | string | コンピュータ名 |
| SqlInstance | string | インスタンス名 |
| Database | string | データベース名 |
| DatabaseId | int | データベースID |
| Schema | string | スキーマ名 |
| Name | string | ビュー名 |
| Owner | string | 所有者 |
| IsSystemObject | bool | システムオブジェクトフラグ |
| CreateDate | DateTime | 作成日 |
| LastModified | DateTime | 最終更新日 |
| ViewTextFound | string | 一致した行（行番号付き） |

#### 処理フロー

1. SQL Server 2005以上のバージョンチェック
2. sys.sql_modulesとsys.viewsを結合するSQLで定義取得
3. IncludeSystemObjects未指定時、is_ms_shipped = 0でフィルタ
4. 各ビューのTextBodyに対してPattern照合
5. 一致時、行を分割しSelect-Stringで行番号付きテキスト抽出
6. "(LineNumber: N) テキスト"形式で結果出力

### 3.4 Copy-DbaDbViewData

#### 目的
ビューからデータを読み取り、SqlBulkCopyを使用して高速に宛先テーブルへコピーします。

#### パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|--------------|------|
| SqlInstance | DbaInstanceParameter | No | - | ソースインスタンス |
| SqlCredential | PSCredential | No | - | ソース認証情報 |
| Destination | DbaInstanceParameter[] | No | - | 宛先インスタンス |
| DestinationSqlCredential | PSCredential | No | - | 宛先認証情報 |
| Database | string | No | - | ソースデータベース |
| DestinationDatabase | string | No | - | 宛先データベース |
| View | string[] | No | - | ソースビュー名 |
| DestinationTable | string | No | - | 宛先テーブル名 |
| Query | string | No | - | カスタムSELECTクエリ |
| AutoCreateTable | switch | No | - | テーブル自動作成 |
| BatchSize | int | No | 50000 | バッチサイズ |
| NotifyAfter | int | No | 5000 | 進捗通知間隔 |
| NoTableLock | switch | No | - | TABLOCKを無効化 |
| CheckConstraints | switch | No | - | 制約チェック有効 |
| FireTriggers | switch | No | - | トリガー発火有効 |
| KeepIdentity | switch | No | - | IDENTITY値保持 |
| KeepNulls | switch | No | - | NULL値保持 |
| Truncate | switch | No | - | 事前削除 |
| BulkCopyTimeOut | int | No | 5000 | タイムアウト（秒） |
| InputObject | TableViewBase[] | No | - | パイプライン入力 |
| EnableException | switch | No | - | 例外を有効化 |

#### 出力

| プロパティ | 型 | 説明 |
|-----------|-----|------|
| SourceInstance | string | ソースインスタンス名 |
| SourceDatabase | string | ソースデータベース名 |
| SourceDatabaseID | int | ソースデータベースID |
| SourceSchema | string | ソーススキーマ名 |
| SourceTable | string | ソースビュー名 |
| DestinationInstance | string | 宛先インスタンス名 |
| DestinationDatabase | string | 宛先データベース名 |
| DestinationDatabaseID | int | 宛先データベースID |
| DestinationSchema | string | 宛先スキーマ名 |
| DestinationTable | string | 宛先テーブル名 |
| RowsCopied | int | コピーされた行数 |
| Elapsed | TimeSpan | 経過時間 |

#### 処理フロー

1. Copy-DbaDbTableDataをラッパーとして呼び出し
2. 全パラメータをそのまま転送（@PSBoundParameters）
3. Copy-DbaDbTableDataがビューもテーブルも同様に処理

## 4. UI/UX仕様

### 4.1 コマンドライン操作

```powershell
# 基本的なビュー取得
Get-DbaDbView -SqlInstance sql2016

# ユーザービューのみ取得
Get-DbaDbView -SqlInstance Server1 -ExcludeSystemView

# 特定スキーマのビュー取得
Get-DbaDbView -SqlInstance Server1 -Database db1 -Schema dbo

# ビュー定義内のパターン検索
Find-DbaView -SqlInstance DEV01 -Pattern "CustomerTable"

# ビューの削除
Remove-DbaDbView -SqlInstance localhost -Database db1 -View view1, view2

# パイプラインでの削除
Get-DbaDbView -SqlInstance sql1 -Database db1 -View vw1 | Remove-DbaDbView

# ビューデータのコピー
Copy-DbaDbViewData -SqlInstance sql1 -Destination sql2 -Database db1 -View dbo.test_view
```

### 4.2 出力例

```
ComputerName InstanceName SqlInstance Database Schema CreateDate          DateLastModified    Name
------------ ------------ ----------- -------- ------ ----------          ----------------    ----
SERVER1      MSSQLSERVER  SERVER1     db1      dbo    2024-01-15 10:30:00 2024-02-20 14:45:00 vw_Customers
SERVER1      MSSQLSERVER  SERVER1     db1      dbo    2024-01-20 09:15:00 2024-01-20 09:15:00 vw_Orders
```

## 5. エラーハンドリング

### 5.1 エラーケース

| エラー条件 | 対処方法 | 出力 |
|-----------|----------|------|
| データベースアクセス不可 | Write-Message Warning、スキップ | 警告メッセージ |
| ビュー名パース失敗 | Write-Message Warning、Continue | 警告メッセージ |
| Drop失敗（依存関係等） | Stop-Function、Status=エラーメッセージ | IsRemoved=false |
| SQL Server 2005未満 | Write-Message Warning | 処理スキップ |

### 5.2 ConfirmImpact

| コマンド | ConfirmImpact | 説明 |
|----------|---------------|------|
| Get-DbaDbView | なし | 参照のみ |
| Remove-DbaDbView | High | 確認プロンプト表示 |
| Find-DbaView | なし | 参照のみ |
| Copy-DbaDbViewData | なし（デフォルト） | SupportsShouldProcess |

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

### 6.1 必要権限

| 操作 | 必要権限 |
|------|----------|
| ビュー取得 | VIEW DEFINITION権限 |
| ビュー削除 | DROP VIEW権限またはdb_ddladmin |
| ビュー検索 | VIEW DEFINITION権限 |
| データコピー | SELECT権限（ソース）、INSERT権限（宛先） |

### 6.2 暗号化ビュー

- IsEncrypted = trueのビューはTextBodyが取得不可
- Find-DbaViewでの検索対象外

## 7. パフォーマンス考慮事項

### 7.1 Views.ClearAndInitialize()

- Get-DbaDbViewは初期読み込みを最適化
- 必要なプロパティのみ一括取得
- 大量ビュー環境でのパフォーマンス向上

### 7.2 システムビュー除外

- ExcludeSystemViewの使用推奨
- 1データベースあたり400以上のシステムビューが存在可能
- ユーザービューのみの場合、大幅な出力削減

### 7.3 SqlBulkCopy

- Copy-DbaDbViewDataはSqlBulkCopyを使用
- BatchSize=50000がデフォルト
- 大量データの高速転送に最適

## 8. 関連コマンド

| コマンド | 関連性 |
|----------|--------|
| Get-DbaDatabase | データベースオブジェクト取得 |
| Get-DbaDbTable | テーブル管理（類似機能） |
| Copy-DbaDbTableData | データコピーの基盤機能 |
| Find-DbaStoredProcedure | パターン検索（類似機能） |

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

### 9.1 関連ファイル一覧

| ファイルパス | 行数 | 役割 |
|-------------|------|------|
| public/Get-DbaDbView.ps1 | 221 | ビュー取得コマンド |
| public/Remove-DbaDbView.ps1 | 138 | ビュー削除コマンド |
| public/Find-DbaView.ps1 | 235 | ビュー検索コマンド |
| public/Copy-DbaDbViewData.ps1 | 227 | ビューデータコピーコマンド |

### 9.2 データ構造

```
Microsoft.SqlServer.Management.Smo.View
├── Name: ビュー名
├── Schema: スキーマ名
├── CreateDate: 作成日
├── DateLastModified: 最終更新日
├── IsSystemObject: システムオブジェクトフラグ
├── IsEncrypted: 暗号化フラグ
├── TextBody: ビュー定義本体
└── Parent: Database (親データベース)
```

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

```
Get-DbaDbView
├── Get-DbaDatabase (行159)
│   └── Connect-DbaInstance
├── Get-ObjectNameParts (行134-147) - 3パート名パース
├── Views.ClearAndInitialize (行167) - プロパティ一括読み込み
├── Add-Member (行212-215) - カスタムプロパティ追加
└── Select-DefaultView (行217) - 出力整形

Remove-DbaDbView
├── Get-DbaDbView (行104) - ビュー取得
├── ShouldProcess (行113) - 確認プロンプト
├── View.Drop() (行126) - SMO削除メソッド
└── Get-ErrorMessage (行131) - エラー処理

Find-DbaView
├── Connect-DbaInstance (行127)
├── ExecuteWithResults (行161) - SQL実行
├── Select-String (行175) - パターンマッチ
└── Select-DefaultView (行191) - 出力整形

Copy-DbaDbViewData
└── Copy-DbaDbTableData (行225) - 完全委譲
```

### 9.4 データフロー図

```
[SQL Server Instance]
        │
        ▼
   [Connect-DbaInstance]
        │
        ▼
   [Get-DbaDatabase]
        │
        ▼
   ┌────────────────────┐
   │  Database.Views    │
   │  コレクション      │
   └────────────────────┘
        │
        ├──────────────────────────────────┐
        │                                  │
        ▼                                  ▼
   [Get-DbaDbView]                   [Find-DbaView]
   SMOオブジェクト取得               sys.sql_modules参照
        │                                  │
        ├──────────────┐                   │
        │              │                   │
        ▼              ▼                   ▼
[Remove-DbaDbView] [Copy-DbaDbViewData] [パターンマッチ結果]
   Drop()実行      SqlBulkCopy実行
```

## 10. 注意事項・制限事項

1. **3パート名サポート**: Get-DbaDbViewのViewパラメータは[database].[schema].[view]形式をサポート
2. **システムビュー**: ExcludeSystemViewを使用しないと大量のシステムビューが含まれる
3. **暗号化ビュー**: TextBodyが取得できないため、Find-DbaViewでの検索対象外
4. **Copy-DbaDbViewData**: 実体はCopy-DbaDbTableDataの完全ラッパー
5. **バージョン制限**: Find-DbaViewはSQL Server 2005以上が必要
6. **コレクション変更**: Remove-DbaDbViewはendブロックで削除を実行（列挙中の変更問題回避）

## 11. 改訂履歴

| バージョン | 日付 | 変更内容 | 作成者 |
|-----------|------|----------|--------|
| 1.0 | 2026-02-18 | 初版作成 | dbatools team + Claude |
