# 機能設計書 436-Remove-DbaRegServer

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおけるRemove-DbaRegServer機能の設計仕様を定義する。

### 本機能の処理概要

Remove-DbaRegServerは、SQL Server Central Management Server（CMS）またはローカル登録サーバーグループから登録サーバーを削除する機能である。

**業務上の目的・背景**：サーバーの廃止、環境の整理、構成変更に伴い、CMSやローカル登録サーバーから不要なサーバー登録を削除する必要がある。この機能は、SSMSでの手動削除操作を自動化し、一括削除やスクリプトによる定期的なクリーンアップを可能にする。廃止サーバーの整理を効率化し、CMSの整合性を維持する。

**機能の利用シーン**：
- サーバー廃止に伴う登録削除
- 環境整理時の不要サーバー一括削除
- グループ単位での登録サーバークリアリング
- 自動化スクリプトでの定期クリーンアップ

**主要な処理内容**：
1. 対象サーバーの取得（SqlInstance/Name/ServerName/Group/InputObject）
2. Azure Data Studio登録の除外（変更不可）
3. ShouldProcess確認（ConfirmImpact = High）
4. SMOのDropメソッドで削除実行
5. 削除結果をPSCustomObjectで返却

**関連システム・外部連携**：SQL Server Central Management Server（CMS）、ローカル登録サーバーグループ

**権限による制御**：CMSへの変更権限（通常はsysadmin）が必要。ローカル登録サーバーはユーザープロファイルのアクセス権で制御。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | 該当なし（コマンドライン機能） | - | - |

## 機能種別

データ操作 / DELETE処理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | No | CMSインスタンス | - |
| SqlCredential | PSCredential | No | 代替認証情報 | - |
| Name | string[] | No | 削除対象の表示名 | - |
| ServerName | string[] | No | 削除対象のサーバーインスタンス名 | - |
| Group | string[] | No | 削除対象のグループ | - |
| InputObject | RegisteredServer[] | No | 削除対象オブジェクト | パイプライン入力可能 |
| WhatIf | switch | No | 実行前確認（実行しない） | - |
| Confirm | switch | No | 実行確認プロンプト | デフォルト有効（High Impact） |
| EnableException | switch | No | 例外処理の有効化 | - |

### 入力データソース

- Get-DbaRegServerからのパイプライン入力
- SqlInstance/Name/ServerName/Groupの直接指定
- SqlInstance未指定時はローカル登録サーバー

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | CMSをホストするコンピュータ名（CMS登録時） |
| InstanceName | string | CMSインスタンス名（CMS登録時） |
| SqlInstance | string | 完全なCMSインスタンス名（CMS登録時） |
| Name | string | 削除された登録サーバーの表示名 |
| ServerName | string | SQL Server接続文字列 |
| Status | string | 操作ステータス（Dropped） |

### 出力先

- 削除結果オブジェクトをパイプライン出力

## 処理フロー

### 処理シーケンス

```
1. 対象サーバーの取得
   └─ SqlInstance指定時: Get-DbaRegServerでCMSから取得
   └─ SqlInstance未指定: ローカル登録サーバーから取得
2. Azure Data Studio除外確認
   └─ Source = "Azure Data Studio"の場合はスキップ
3. 表示プロパティの設定
   └─ ID有無に応じてデフォルトプロパティを設定
4. ShouldProcess確認
   └─ ConfirmImpact = HighのためデフォルトでConfirm
5. Drop実行
   └─ SMOのDropメソッドで削除
6. 接続切断
   └─ Disconnect-RegServerで切断
7. 結果返却
   └─ PSCustomObjectで削除結果を返却
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{SqlInstance指定?}
    B -->|Yes| C[Get-DbaRegServer CMS]
    B -->|No| D{InputObject?}
    D -->|Yes| E[InputObject使用]
    D -->|No| F[Get-DbaRegServer ローカル]
    C --> G[regserverループ]
    E --> G
    F --> G
    G --> H{Azure Data Studio?}
    H -->|Yes| I[Stop-Function スキップ]
    H -->|No| J{ID存在?}
    J -->|Yes| K[CMS用プロパティ設定]
    J -->|No| L[ローカル用プロパティ設定]
    K --> M[ShouldProcess確認]
    L --> M
    M -->|No| N{次のサーバー?}
    M -->|Yes| O[Drop実行]
    O --> P{ID存在?}
    P -->|Yes| Q[Disconnect-RegServer]
    P -->|No| R[結果生成]
    Q --> R
    R --> S[PSCustomObject出力]
    S --> N
    I --> N
    N -->|Yes| G
    N -->|No| T[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | Azure Data Studio除外 | Azure Data Studioの登録サーバーは削除不可 | Source = "Azure Data Studio" |
| BR-002 | 確認プロンプト | ConfirmImpact = HighのためデフォルトでConfirm | 常時 |
| BR-003 | 出力プロパティ分岐 | CMS登録とローカル登録で出力プロパティが異なる | ID有無で判定 |
| BR-004 | ローカル自動検出 | SqlInstance未指定時はローカル登録サーバーを対象 | SqlInstance未指定 |

### 計算ロジック

特になし。

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| サーバー削除 | msdb系システムテーブル | DELETE | 登録サーバー情報の削除 |

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

SMOを介した間接的な操作のため、直接のテーブル操作仕様は非公開。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 操作不可 | Azure Data Studio登録を削除しようとした | 手動でAzure Data Studioから削除 |
| - | 削除失敗 | Dropメソッド実行エラー | 権限、接続を確認 |

### リトライ仕様

リトライ機能は実装されていない。

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

トランザクション管理はSMOに委譲。

## パフォーマンス要件

特定のパフォーマンス要件は定義されていない。

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

- CMSへの変更権限（sysadmin推奨）が必要
- ConfirmImpact = Highにより誤操作を防止
- Azure Data Studio登録は保護される

## 備考

- Confirm:$falseで確認プロンプトを無効化可能
- Get-DbaRegServerからパイプラインで直接削除可能

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Microsoft.SqlServer.Management.RegisteredServers.RegisteredServer | (SMO) | Dropメソッドの理解 |

**読解のコツ**: RegisteredServerオブジェクトのDropメソッドで登録を削除。ID存在はCMS登録を示す。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Remove-DbaRegServer.ps1 | `public/Remove-DbaRegServer.ps1` | パラメータ定義、ConfirmImpact設定 |

**主要処理フロー**:
1. **96-106行目**: パラメータ定義
2. **108-111行目**: SqlInstanceからの取得
3. **113-115行目**: SqlInstance/InputObject未指定時のローカル取得

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Remove-DbaRegServer.ps1 | `public/Remove-DbaRegServer.ps1` | 削除処理のコアロジック |

**主要処理フロー**:
- **117-120行目**: Azure Data Studio除外
- **122-128行目**: ID有無による表示プロパティ分岐
- **130-148行目**: ShouldProcess、Drop実行、結果返却

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

```
Remove-DbaRegServer
    │
    ├─ Get-DbaRegServer
    │      └─ 削除対象サーバー取得
    │
    ├─ [RegisteredServer].Drop()
    │      └─ 登録削除
    │
    └─ Disconnect-RegServer (内部関数)
           └─ 接続切断
```

### データフロー図

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

SqlInstance ────────────▶ Get-DbaRegServer ──────────┐
                                                     │
InputObject ────────────▶ 直接使用 ──────────────────┤
                                                     │
ローカル ───────────────▶ Get-DbaRegServer ──────────┤
                                                     │
                         Azure Data Studio除外 ──────┤
                                                     │
                         Drop() ─────────────────────┼──▶ PSCustomObject
                                                     │    {Status: "Dropped"}
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Remove-DbaRegServer.ps1 | `public/Remove-DbaRegServer.ps1` | ソース | メイン機能実装 |
| Get-DbaRegServer.ps1 | `public/Get-DbaRegServer.ps1` | ソース | サーバー取得 |
