# 機能設計書 350-Remove-DbaLinkedServer

## 概要

本ドキュメントは、dbatools PowerShellモジュールのRemove-DbaLinkedServer関数の機能設計書である。この関数はSQL Serverインスタンスからリンクサーバーを削除する。

### 本機能の処理概要

Remove-DbaLinkedServer関数は、対象SQL Serverインスタンスから1つ以上のリンクサーバーを削除し、ローカルサーバーとリモートサーバー間の接続を切断する。

**業務上の目的・背景**：レガシー接続の廃止、サーバー移行時のクリーンアップ、セキュリティコンプライアンス要件への対応など、使用されなくなったリンクサーバーを削除する必要がある場合がある。この関数は、リンクサーバーの削除プロセスを自動化し、-Forceパラメータを使用することで関連するログインも同時に削除できる。

**機能の利用シーン**：使用されなくなったリンクサーバーを廃止する場合、サーバー移行後にクリーンアップする場合、セキュリティ監査で不要な接続を削除する場合に使用される。

**主要な処理内容**：
1. 対象のリンクサーバーを特定する
2. ShouldProcessで削除の確認を行う
3. LinkedServer.Drop()メソッドで削除する
4. -Force指定時は関連するログインも同時に削除する

**関連システム・外部連携**：SQL Server SMO (LinkedServer.Drop()メソッド)。

**権限による制御**：リンクサーバーを削除するための適切なSQL Server権限（ALTER ANY LINKED SERVERなど）が必要。

## 関連画面

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

## 機能種別

データ削除（リンクサーバー構成の削除）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | No | 対象SQL Serverインスタンス | 有効なSQL Serverインスタンス名 |
| SqlCredential | PSCredential | No | SQL Server接続用資格情報 | 有効なPSCredentialオブジェクト |
| LinkedServer | string[] | No | 削除対象のリンクサーバー名 | 存在するリンクサーバー名 |
| InputObject | object[] | No | パイプライン入力用オブジェクト | SMO LinkedServerまたはServerオブジェクト |
| Force | switch | No | 関連するログインも同時に削除 | true/false |
| EnableException | switch | No | 例外処理の動作を制御 | true/false |
| Confirm | switch | No | 変更前の確認 | true/false |
| WhatIf | switch | No | 実行シミュレーション | true/false |

### 入力データソース

- SqlInstance + LinkedServer: インスタンスとリンクサーバー名を直接指定
- InputObject: Get-DbaLinkedServerまたはConnect-DbaInstanceからのパイプライン入力

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| なし | - | 削除操作のため出力なし |

### 出力先

なし（削除操作）

## 処理フロー

### 処理シーケンス

```
1. 入力オブジェクトの収集
   └─ SqlInstance指定時: Connect-DbaInstanceで接続
   └─ InputObject指定時: そのまま使用

2. 削除対象の特定
   ├─ SMO Serverオブジェクトの場合:
   │      └─ LinkedServerパラメータで指定された名前をフィルタ
   │      └─ LinkedServer必須チェック
   └─ SMO LinkedServerオブジェクトの場合:
          └─ そのまま削除対象に追加

3. 各リンクサーバーの削除
   └─ ShouldProcessで確認
   └─ LinkedServer.Drop($Force)で削除
   └─ $Forceが$trueの場合は関連ログインも削除
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{SqlInstance指定?}
    B -->|Yes| C[Connect-DbaInstance]
    B -->|No| D[InputObject使用]
    C --> E[InputObjectに追加]
    D --> E
    E --> F[各InputObjectループ]
    F --> G{Server型?}
    G -->|Yes| H{LinkedServer指定?}
    H -->|No| I[エラー: LinkedServer必須]
    H -->|Yes| J[LinkedServersから対象を取得]
    G -->|No| K{LinkedServer型?}
    K -->|Yes| L[削除対象に追加]
    K -->|No| M[スキップ]
    J --> N[削除対象リストに追加]
    L --> N
    N --> O[各削除対象ループ]
    O --> P{ShouldProcess?}
    P -->|No| Q[スキップ]
    P -->|Yes| R[Drop($Force)]
    R --> S{次の対象?}
    Q --> S
    S -->|Yes| O
    S -->|No| T[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | LinkedServer必須（Server型） | SMO Serverオブジェクト入力時はLinkedServer名の指定が必須 | InputObjectがServer型の場合 |
| BR-002 | 存在確認 | 指定されたリンクサーバーが存在しない場合はエラー | Server型入力時 |
| BR-003 | Force動作 | Forceフラグは関連するログインも同時に削除 | Force指定時 |
| BR-004 | 高確認レベル | ConfirmImpact=Highのため、確認プロンプトがデフォルトで表示 | 常に適用 |
| BR-005 | 複数入力サポート | 配列およびパイプライン入力で複数のリンクサーバーを一括削除 | 常に適用 |

### 計算ロジック

該当なし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| リンクサーバー削除 | sys.servers | DELETE | LinkedServer.Drop()実行 |
| ログイン削除（Force時） | sys.linked_logins | DELETE | 関連するログインマッピングを削除 |

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

#### sys.servers
| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| DELETE | - | name = LinkedServer名 | Drop()メソッドで削除 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 必須パラメータ不足 | Server型InputObjectでLinkedServer未指定 | LinkedServerを指定 |
| - | 存在しない | 指定されたリンクサーバーが存在しない | 正しい名前を確認 |
| - | 削除失敗 | 依存関係がある場合など | Forceを使用または依存関係を先に削除 |

### リトライ仕様

明示的なリトライ機能はなし。各リンクサーバーは独立して処理され、1つの失敗が他に影響しない。

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

各リンクサーバーの削除は個別に実行される。1つの削除失敗は他のリンクサーバーの処理に影響しない。

## パフォーマンス要件

- リンクサーバー削除は通常数秒以内で完了
- Forceオプション使用時はログイン削除の追加処理がある

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

- リンクサーバーを削除するための適切な権限が必要
- ConfirmImpact=Highにより、デフォルトで確認プロンプトが表示される
- WhatIfで削除対象を事前に確認可能
- 削除は元に戻せないため慎重に実行

## 備考

- Get-DbaLinkedServerからのパイプライン入力をサポート
- Connect-DbaInstanceからのパイプライン入力もサポート（LinkedServer指定が必要）
- 削除操作のため出力オブジェクトはなし
- ConfirmImpact=Highのため、-Confirm:$falseで確認を抑制可能

---

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

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

### 推奨読解順序

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

入力として受け取るオブジェクトの型を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Remove-DbaLinkedServer.ps1 | `public/Remove-DbaLinkedServer.ps1` | 88-89行目のInputObjectパラメータ型確認 |

**読解のコツ**: InputObjectはobject[]型で、SMO ServerまたはLinkedServerオブジェクトを受け取る。

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

関数の入口と主要パラメータを確認する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Remove-DbaLinkedServer.ps1 | `public/Remove-DbaLinkedServer.ps1` | 83-92行目のパラメータ定義を確認 |

**主要処理フロー**:
1. **83-92行目**: param()ブロックでパラメータ定義
2. **83行目**: ConfirmImpact=Highの設定

#### Step 3: 入力処理ロジックを理解する

processブロックでのオブジェクト収集を追う。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Remove-DbaLinkedServer.ps1 | `public/Remove-DbaLinkedServer.ps1` | 96-122行目のprocess{}ブロック |

**主要処理フロー**:
- **98-100行目**: SqlInstance指定時の接続
- **102-121行目**: InputObjectの型に応じた処理分岐

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

endブロックでの実際の削除処理を追う。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Remove-DbaLinkedServer.ps1 | `public/Remove-DbaLinkedServer.ps1` | 124-136行目のend{}ブロック |

**主要処理フロー**:
- **126-128行目**: ShouldProcessで確認
- **130行目**: Drop($Force)で削除

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

```
Remove-DbaLinkedServer
    │
    ├─ Connect-DbaInstance (SqlInstance指定時)
    │      └─ SQL Server接続
    │
    ├─ $server.LinkedServers[$ls] (Server型InputObject時)
    │      └─ リンクサーバー取得
    │
    └─ $lsToDrop.Drop([boolean]$Force)
           └─ リンクサーバー削除
```

### データフロー図

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

SqlInstance ─────────▶ Connect-DbaInstance ──▶ Server接続
                              │
LinkedServer ────────▶ LinkedServers[$ls] ──▶ 対象特定
                              │
InputObject ─────────▶ 型チェック ──▶ Server/LinkedServer判定
(Get-DbaLinkedServer)        │
                              ▼
                      削除対象リスト収集
                              │
                              ▼
                      ShouldProcess確認
                              │
                              ▼
                      Drop($Force) ──▶ 削除完了
                              │
                              ▼
                         (出力なし)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Remove-DbaLinkedServer.ps1 | `public/Remove-DbaLinkedServer.ps1` | ソース | メイン関数 |
| Get-DbaLinkedServer.ps1 | `public/Get-DbaLinkedServer.ps1` | ソース | パイプライン入力元として使用可能 |
| New-DbaLinkedServer.ps1 | `public/New-DbaLinkedServer.ps1` | ソース | リンクサーバー作成関数 |
| Copy-DbaLinkedServer.ps1 | `public/Copy-DbaLinkedServer.ps1` | ソース | 関連するコピー関数 |
