# 機能設計書 326-Uninstall-DbaSqlWatch

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおける `Uninstall-DbaSqlWatch` 機能の設計書である。SqlWatch監視ソリューションをSQL Serverインスタンスから完全に削除する機能を提供する。

### 本機能の処理概要

**業務上の目的・背景**：SqlWatchの利用を終了する場合や、新規インストール前に既存のSqlWatchを完全削除する必要がある場合に、関連するすべてのデータベースオブジェクト、SQL Agentジョブ、Extended Eventsセッション、Service Brokerコンポーネント、アセンブリ、ユーザー定義テーブル型を確実に削除する必要がある。本機能は、これらのオブジェクトを体系的に特定・削除し、DACPAC登録も解除する。

**機能の利用シーン**：SqlWatchの完全アンインストール、クリーンな再インストール前の準備、別の監視ソリューションへの移行、開発・テスト環境のクリーンアップなどで利用される。

**主要な処理内容**：
1. 対象インスタンスへの接続
2. SqlWatch関連オブジェクトの特定（テーブル、ビュー、プロシージャ、関数、ジョブ、XEセッション、アセンブリ、テーブル型、Service Brokerコンポーネント）
3. 依存関係を考慮した順序での削除
4. DACPAC登録解除
5. 削除結果の確認

**関連システム・外部連携**：
- SqlWatch（削除対象）
- Install-DbaSqlWatch（関連機能）
- Microsoft.SqlServer.Dac（DACPAC操作）

**権限による制御**：ターゲットデータベースでのオブジェクト削除権限、SQL Agentジョブ削除権限、Extended Events削除権限が必要。通常はdb_owner、sysadmin権限で実行される。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | CLIコマンド | 主機能 | PowerShellコマンドラインからの実行 |

## 機能種別

アンインストール処理 / オブジェクト削除

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | Yes | ターゲットSQL Serverインスタンス | パイプラインから受け取り可能 |
| SqlCredential | PSCredential | No | 認証用資格情報 | Windows/SQL認証対応 |
| Database | string | No | SqlWatchインストール先データベース（デフォルト: master） | - |
| EnableException | switch | No | 例外を有効化 | - |
| Confirm | switch | No | 確認プロンプト表示 | SupportsShouldProcess |
| WhatIf | switch | No | 実行内容の表示のみ | SupportsShouldProcess |

### 入力データソース

- SQL Serverインスタンス: 削除対象のSqlWatchオブジェクトを含むデータベース

## 出力仕様

### 出力データ

本機能は出力オブジェクトを返却しない。削除処理のみを実行する。

### 出力先

なし（コンソールへのVerboseメッセージのみ）

## 処理フロー

### 処理シーケンス

```
1. PowerShell Coreチェック
   └─ PS Coreでは処理中断（非対応）
2. 対象インスタンスに接続
   └─ Connect-DbaInstanceで接続
3. SqlWatch関連オブジェクトの取得
   └─ テーブル、ビュー、プロシージャ、関数、ジョブ、XEセッション、アセンブリ、テーブル型、Service Brokerコンポーネント
4. SQL Agentジョブの削除
   └─ Remove-DbaAgentJobで削除
5. ストアドプロシージャの削除
   └─ SMO Dropメソッドで削除
6. ビューの削除
   └─ SMO Dropメソッドで削除
7. 関数の削除
   └─ SMO Dropメソッドで削除（依存関係考慮）
8. 外部キーの削除
   └─ テーブルの外部キー制約を削除
9. テーブルの削除
   └─ SMO Dropメソッドで削除
10. アセンブリの削除
    └─ SMO Dropメソッドで削除
11. テーブル型の削除
    └─ SMO Dropメソッドで削除
12. Service Brokerサービスの削除
    └─ SMO Dropメソッドで削除
13. Service Brokerキューの削除
    └─ SMO Dropメソッドで削除
14. XEセッションの削除
    └─ Remove-DbaXESessionで削除
15. DACPAC登録解除
    └─ DacServices.Unregisterで解除
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{PowerShell Core?}
    B -->|Yes| C[エラー：非対応]
    B -->|No| D[Connect-DbaInstance]
    D --> E{接続成功?}
    E -->|No| F[エラー出力して次へ]
    E -->|Yes| G[SqlWatch関連オブジェクト取得]
    G --> H[SQL Agentジョブ削除]
    H --> I[ストアドプロシージャ削除]
    I --> J[ビュー削除]
    J --> K[関数削除]
    K --> L[外部キー削除]
    L --> M[テーブル削除]
    M --> N[アセンブリ削除]
    N --> O[テーブル型削除]
    O --> P[Service Brokerサービス削除]
    P --> Q[Service Brokerキュー削除]
    Q --> R[XEセッション削除]
    R --> S[DACPAC登録解除]
    S --> T{次のインスタンス?}
    F --> T
    T -->|Yes| D
    T -->|No| U[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-326-01 | PS Core非対応 | PowerShell Coreでは実行不可 | $PSEdition='Core'時 |
| BR-326-02 | 依存関係順序 | 外部キー → テーブルの順で削除 | テーブル削除時 |
| BR-326-03 | 関数削除順序 | 一部の関数は最後に削除 | 関数依存関係時 |
| BR-326-04 | オブジェクト命名規則 | sqlwatch_*, vw_sqlwatch_*, usp_sqlwatch_*等で特定 | オブジェクト検索時 |

### 計算ロジック

オブジェクト特定パターン：
- テーブル: sqlwatch_*, dbachecks*, __RefactorLog
- ビュー: vw_sqlwatch_*
- プロシージャ: usp_sqlwatch_*, Stream*
- 関数: ufn_sqlwatch_*, Get*, Read*（一部例外あり）
- ジョブ: SqlWatch-*
- XEセッション: SQLWATCH_*
- アセンブリ: SqlWatch*
- テーブル型: utype_*
- Service Broker: sqlwatch_*

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

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

| 操作 | 対象オブジェクト | 操作種別 | 概要 |
|-----|-----------------|---------|------|
| ジョブ削除 | SqlWatch-*ジョブ | DELETE | SQL Agentジョブ削除 |
| プロシージャ削除 | usp_sqlwatch_*等 | DROP | ストアドプロシージャ削除 |
| ビュー削除 | vw_sqlwatch_* | DROP | ビュー削除 |
| 関数削除 | ufn_sqlwatch_*等 | DROP | ユーザー定義関数削除 |
| 外部キー削除 | テーブルのFK | DROP | 外部キー制約削除 |
| テーブル削除 | sqlwatch_*等 | DROP | テーブル削除（データ含む） |
| アセンブリ削除 | SqlWatch* | DROP | CLRアセンブリ削除 |
| テーブル型削除 | utype_* | DROP | ユーザー定義テーブル型削除 |
| Service Broker削除 | sqlwatch_* | DROP | キュー、サービス削除 |
| XEセッション削除 | SQLWATCH_* | DROP | Extended Eventsセッション削除 |
| DACPAC解除 | DACPAC登録 | UNREGISTER | データ層アプリケーション登録解除 |

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

#### 各種SqlWatchオブジェクト

| 操作 | 対象 | 処理内容 | 備考 |
|-----|------|---------|------|
| DROP | テーブル | ForeignKeys.Drop() → Table.Drop() | 外部キーを先に削除 |
| DROP | ビュー、プロシージャ、関数 | Object.Drop() | SMOメソッド使用 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | PlatformError | PowerShell Core使用 | Stop-Functionで処理中断 |
| - | ConnectionError | インスタンス接続失敗 | Stop-Functionで処理継続 |
| - | DropError | 各オブジェクト削除失敗 | Stop-Functionで処理継続 |
| - | UnregisterError | DACPAC登録解除失敗 | Stop-Functionでエラー出力 |

### リトライ仕様

明示的なリトライ機能は実装されていない。各オブジェクト削除は個別にtry-catchで処理される。

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

明示的なトランザクション制御は行われていない。各オブジェクトは個別に削除され、部分的な削除状態になる可能性がある。

## パフォーマンス要件

特に定義されていない。オブジェクト数に応じた処理時間が必要。

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

- Windows認証およびSQL認証に対応
- MFAサポートはConnect-DbaInstanceを事前に使用
- ターゲットデータベースのオブジェクト削除権限が必要
- SQL Agentジョブ削除権限が必要

## 備考

- SqlWatch公式サイト: https://sqlwatch.io
- 作者: Ken K (github.com/koglerk)
- PowerShell Coreは非対応（Windows PowerShellが必要）

---

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

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

### 推奨読解順序

#### Step 1: オブジェクト特定ロジックを理解する

削除対象オブジェクトの特定パターンを把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Uninstall-DbaSqlWatch.ps1 | `public/Uninstall-DbaSqlWatch.ps1` | 81-92行目のオブジェクト取得ロジック |

**読解のコツ**: Where-Objectのフィルタ条件でオブジェクト命名パターンを確認。Sort-Objectで削除順序も考慮。

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

パラメータ定義と初期チェックを確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Uninstall-DbaSqlWatch.ps1 | `public/Uninstall-DbaSqlWatch.ps1` | 57-64行目のparam定義 |
| 2-2 | Uninstall-DbaSqlWatch.ps1 | `public/Uninstall-DbaSqlWatch.ps1` | 70-73行目のPowerShell Coreチェック |

**主要処理フロー**:
1. **57-64行目**: パラメータ定義（Database=master がデフォルト）
2. **70-73行目**: PowerShell Core非対応チェック
3. **74-79行目**: Connect-DbaInstanceで接続

#### Step 3: 削除処理を理解する

各オブジェクト種別の削除順序と処理を確認。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Uninstall-DbaSqlWatch.ps1 | `public/Uninstall-DbaSqlWatch.ps1` | 94-101行目のジョブ削除 |
| 3-2 | Uninstall-DbaSqlWatch.ps1 | `public/Uninstall-DbaSqlWatch.ps1` | 136-154行目のテーブル削除（FK→テーブル） |
| 3-3 | Uninstall-DbaSqlWatch.ps1 | `public/Uninstall-DbaSqlWatch.ps1` | 210-219行目のDACPAC登録解除 |

**主要処理フロー**:
- **94-101行目**: Remove-DbaAgentJobでジョブ削除
- **136-143行目**: テーブルの外部キー削除（ForeignKeys.Drop()）
- **146-154行目**: テーブル削除（Table.Drop()）
- **213-216行目**: DacServices.Unregisterで登録解除

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

```
Uninstall-DbaSqlWatch
    │
    ├─ Connect-DbaInstance
    │      └─ SQL Serverへの接続
    │
    ├─ Get-DbaDbTable
    │      └─ テーブル一覧取得
    │
    ├─ Get-DbaDbView
    │      └─ ビュー一覧取得
    │
    ├─ Get-DbaDbStoredProcedure
    │      └─ プロシージャ一覧取得
    │
    ├─ Get-DbaDbUdf
    │      └─ 関数一覧取得
    │
    ├─ Get-DbaAgentJob
    │      └─ ジョブ一覧取得
    │
    ├─ Get-DbaXESession
    │      └─ XEセッション一覧取得
    │
    ├─ Get-DbaDbAssembly
    │      └─ アセンブリ一覧取得
    │
    ├─ Get-DbaDbUserDefinedTableType
    │      └─ テーブル型一覧取得
    │
    ├─ Get-DbaDbServiceBrokerQueue
    │      └─ Service Brokerキュー一覧取得
    │
    ├─ Get-DbaDbServiceBrokerService
    │      └─ Service Brokerサービス一覧取得
    │
    ├─ Remove-DbaAgentJob
    │      └─ ジョブ削除
    │
    ├─ Remove-DbaXESession
    │      └─ XEセッション削除
    │
    └─ Microsoft.SqlServer.Dac.DacServices
           └─ DACPAC登録解除
```

### データフロー図

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

SqlInstance ───────▶ Connect-DbaInstance
                              │
                              ▼
                    オブジェクト取得
                    （テーブル、ビュー、
                     プロシージャ等）
                              │
                              ▼
                    ┌─────────────────────┐
                    │  削除順序制御        │
                    │  1. ジョブ          │
                    │  2. プロシージャ    │
                    │  3. ビュー          │
                    │  4. 関数            │
                    │  5. FK → テーブル   │
                    │  6. アセンブリ      │
                    │  7. テーブル型      │
                    │  8. Service Broker  │
                    │  9. XEセッション    │
                    │  10. DACPAC解除     │
                    └─────────────────────┘
                              │
                              ▼
                         なし（削除のみ）
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Uninstall-DbaSqlWatch.ps1 | `public/Uninstall-DbaSqlWatch.ps1` | ソース | メイン関数の実装 |
| Install-DbaSqlWatch.ps1 | `public/Install-DbaSqlWatch.ps1` | ソース | インストール関数（関連） |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続 |
| Remove-DbaAgentJob.ps1 | `public/Remove-DbaAgentJob.ps1` | ソース | ジョブ削除 |
| Remove-DbaXESession.ps1 | `public/Remove-DbaXESession.ps1` | ソース | XEセッション削除 |
