# 機能設計書 208-Remove-DbaExtendedProperty

## 概要

本ドキュメントは、dbatools PowerShellモジュールのRemove-DbaExtendedProperty関数の機能設計を定義する。この関数は、SQL Serverオブジェクトから拡張プロパティとして保存されているカスタムメタデータやドキュメントを削除するための機能を提供する。

### 本機能の処理概要

Remove-DbaExtendedPropertyは、SQL Serverオブジェクトに関連付けられた拡張プロパティを削除する。拡張プロパティは、オブジェクトのドキュメント、バージョン情報、コンプライアンスタグ、ビジネスルールなどのカスタムメタデータを保存するために一般的に使用される。

**業務上の目的・背景**：データベーススキーマの再構築、古いドキュメントのクリーンアップ、非推奨のメタデータの一括削除などのシナリオで、拡張プロパティの削除が必要になる。この関数はGet-DbaExtendedPropertyからのパイプライン入力を受け入れ、効率的な削除操作を提供する。

**機能の利用シーン**：
- 古いドキュメントやバージョン情報の削除
- 非推奨のコンプライアンスタグのクリーンアップ
- データベース再構築プロジェクトでのメタデータ削除
- 監査目的での削除操作の追跡

**主要な処理内容**：
1. Get-DbaExtendedPropertyからパイプライン入力を受け入れ
2. ShouldProcess確認
3. Get-ConnectionParentで親データベースを取得
4. sp_dropextendedpropertyストアドプロシージャを実行
5. 削除結果をPSCustomObjectとして出力

**関連システム・外部連携**：
- SQL Server sys.extended_properties：拡張プロパティのシステムビュー
- sp_dropextendedproperty：拡張プロパティ削除用システムストアドプロシージャ
- Get-DbaExtendedProperty：拡張プロパティ取得の連携コマンド

**権限による制御**：対象オブジェクトへの適切な権限が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 222 | 拡張プロパティ | 補助機能 | 拡張プロパティの削除 |

## 機能種別

データ削除（DDL操作）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| InputObject | Microsoft.SqlServer.Management.Smo.ExtendedProperty[] | Yes | 削除する拡張プロパティオブジェクト | ValueFromPipeline |
| EnableException | switch | No | 例外を直接スローするかどうか | - |

### 入力データソース

- パイプライン入力：Get-DbaExtendedPropertyからの拡張プロパティオブジェクト

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverが稼働しているコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| ParentName | string | 拡張プロパティの親オブジェクト名 |
| PropertyType | string | 拡張プロパティの種類 |
| Name | string | 削除された拡張プロパティ名 |
| Status | string | "Dropped"（成功時） |

### 出力先

- パイプライン：PSCustomObject
- SQL Server：拡張プロパティの削除

## 処理フロー

### 処理シーケンス

```
1. process ブロック
   └─ 1.1 各InputObjectについてループ処理
       └─ 1.1.1 ShouldProcess確認
       └─ 1.1.2 Get-ConnectionParentで親データベースを取得
       └─ 1.1.3 sp_dropextendedproperty実行
       └─ 1.1.4 PSCustomObject出力
       └─ 1.1.5 エラー時はStop-Function
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{InputObjectループ}
    B -->|次のプロパティ| C{ShouldProcess?}
    C -->|No| B
    C -->|Yes| D[Get-ConnectionParent]
    D --> E[sp_dropextendedproperty実行]
    E --> F{成功?}
    F -->|Yes| G[PSCustomObject出力]
    G --> B
    F -->|No| H[Stop-Function]
    H --> B
    B -->|完了| I[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-208-01 | 確認プロンプト | ConfirmImpact=Highで実行前に確認を求める | Confirm未指定時 |
| BR-208-02 | パイプライン入力専用 | InputObjectは必須でパイプラインからの入力を期待 | 常時 |
| BR-208-03 | 結果出力 | 成功時のみPSCustomObjectを出力 | 成功時 |

### 計算ロジック

特になし

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

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

| 操作 | 対象 | 操作種別 | 概要 |
|-----|-----|---------|------|
| 拡張プロパティ削除 | sys.extended_properties | DDL | sp_dropextendedproperty実行 |

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

#### sys.extended_properties

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| DELETE | 対象プロパティ | sp_dropextendedproperty @name = N'...' | ストアドプロシージャ経由 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| DropFailed | 実行エラー | sp_dropextendedproperty失敗 | エラー詳細を確認 |

### リトライ仕様

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

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

各拡張プロパティの削除は独立して実行。トランザクション制御は実装されていない。

## パフォーマンス要件

- 単一プロパティの削除は即時完了
- 大量のプロパティを削除する場合は処理時間に注意

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

- 対象オブジェクトへの適切な権限が必要
- ConfirmImpact=Highによる誤操作防止

## 備考

- Chrissy LeMaire (@cl) により作成
- Get-DbaExtendedPropertyとのパイプライン連携が必須
- データベース、テーブル、列、ストアドプロシージャ、ビューなど様々なオブジェクトタイプに対応

---

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

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

### 推奨読解順序

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

SMOのExtendedPropertyオブジェクトの構造を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Microsoft.SqlServer.Management.Smo.ExtendedProperty | SMO | Name、Type、ComputerName、InstanceName、SqlInstance、ParentNameプロパティ |

**読解のコツ**: ExtendedPropertyオブジェクトはGet-ConnectionParentを通じて親データベースを取得し、そのデータベースでsp_dropextendedpropertyを実行する。

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

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

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

**主要処理フロー**:
1. **70-89行目**: process ブロック（削除処理）
2. **72行目**: ShouldProcess確認
3. **73行目**: Get-ConnectionParent呼び出し
4. **75行目**: sp_dropextendedproperty実行

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaExtendedProperty.ps1 | `public/Get-DbaExtendedProperty.ps1` | 拡張プロパティ取得（パイプライン入力元） |
| 3-2 | Get-ConnectionParent.ps1 | `functions/Get-ConnectionParent.ps1` | 親データベース取得 |

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

```
Remove-DbaExtendedProperty
    │
    ├─ Get-ConnectionParent
    │      └─ 親データベースオブジェクト取得
    │
    ├─ $db.Invoke()
    │      └─ sp_dropextendedproperty実行
    │
    └─ Stop-Function
           └─ エラー処理
```

### データフロー図

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

Get-DbaExtendedProperty
    │
    ▼
InputObject ─────────▶ ShouldProcess確認
                             │
                             ▼
                    Get-ConnectionParent
                             │
                             ▼
                    sp_dropextendedproperty
                             │
                             ▼
                    PSCustomObject ─────────▶ パイプライン出力
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Remove-DbaExtendedProperty.ps1 | `public/Remove-DbaExtendedProperty.ps1` | ソース | メイン関数実装 |
| Get-DbaExtendedProperty.ps1 | `public/Get-DbaExtendedProperty.ps1` | ソース | 拡張プロパティ取得（パイプライン入力元） |
| Get-ConnectionParent.ps1 | `functions/Get-ConnectionParent.ps1` | ソース | 親データベース取得 |
