# 機能設計書 200-Remove-DbaClientAlias

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおける`Remove-DbaClientAlias`機能の設計仕様を記載する。この機能は、WindowsレジストリからSQL Serverクライアントエイリアスを削除する。

### 本機能の処理概要

**業務上の目的・背景**：SQL Serverクライアントエイリアスは、接続リクエストを別のサーバーやインスタンスにリダイレクトするために使用される。サーバーの廃止、接続文字列の更新、古いエイリアスによる接続障害のトラブルシューティングなどの場面で、不要になったエイリアスを削除する必要がある。本機能は、cliconfg.exeユーティリティの代替として、プログラム的にクライアントエイリアスを削除する手段を提供する。

**機能の利用シーン**：
- サーバー廃止時のエイリアスクリーンアップ
- 接続障害トラブルシューティング
- 環境移行後の古いエイリアス削除
- 複数コンピューターへの一括エイリアス削除

**主要な処理内容**：
1. 対象コンピューターに対してリモートスクリプトブロックを実行
2. 32bit/64bit両方のレジストリパスを検索
3. 指定されたエイリアスを削除
4. 削除結果をPSCustomObjectで返却

**関連システム・外部連携**：Windowsレジストリ、PowerShellリモーティング。

**権限による制御**：レジストリへの書き込み権限が必要。ローカルコンピューター以外への操作には管理者権限とリモーティングが必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 139 | クライアントエイリアス | 主機能 | クライアントエイリアスの削除 |

## 機能種別

CRUD操作（DELETE） / 構成管理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| ComputerName | DbaInstanceParameter[] | No | 対象コンピューター（デフォルト: ローカル） | ValueFromPipelineByPropertyName |
| Credential | PSCredential | No | リモートコンピューターへの認証情報 | - |
| Alias | string[] | Yes | 削除するエイリアス名 | Mandatory, ValueFromPipelineByPropertyName |
| EnableException | switch | No | 例外をスローするかどうか | - |

### 入力データソース

- パラメータ入力: ComputerName、Alias
- パイプライン入力: Get-DbaClientAliasから

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | 対象コンピューター名 |
| Architecture | string | レジストリアーキテクチャ（32-bit/64-bit） |
| Alias | string | 削除されたエイリアス名 |
| Status | string | 削除状態（"Removed"） |

### 出力先

PowerShellパイプラインへの出力。

## 処理フロー

### 処理シーケンス

```
1. beginブロック
   └─ スクリプトブロック定義
       ├─ 32bit/64bitレジストリパス定義
       ├─ 各パスに対してループ
       │   ├─ パス存在確認
       │   ├─ アーキテクチャ判定
       │   └─ エイリアス削除（Remove-ItemProperty）
       └─ 結果オブジェクト生成
2. processブロック
   ├─ 各ComputerNameに対してループ
   ├─ 管理者権限チェック
   ├─ ShouldProcess確認
   └─ Invoke-Command2でスクリプトブロック実行
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[foreach ComputerName]
    B --> C[Test-ElevationRequirement]
    C --> D{ShouldProcess確認}
    D -->|No| E[次のコンピューターへ]
    D -->|Yes| F[Invoke-Command2]
    F --> G[スクリプトブロック実行]
    G --> H[foreach basekey]
    H --> I{パス存在?}
    I -->|No| J[警告出力]
    I -->|Yes| K{WOW6432Node?}
    K -->|Yes| L[Architecture = 32-bit]
    K -->|No| M[Architecture = 64-bit]
    L --> N[foreach Alias]
    M --> N
    N --> O{エイリアス存在?}
    O -->|Yes| P[Remove-ItemProperty]
    O -->|No| Q[次のエイリアスへ]
    P --> R[PSCustomObject返却]
    R --> Q
    J --> S{次のbasekeyあり?}
    Q --> S
    S -->|Yes| H
    S -->|No| T{次のコンピューターあり?}
    E --> T
    T -->|Yes| B
    T -->|No| U[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | 両アーキテクチャ処理 | 32bit/64bit両方のレジストリを処理 | 常時 |
| BR-002 | デフォルトローカル | ComputerName未指定時はローカルコンピューター | 常時 |
| BR-003 | ShouldProcess | 確認プロンプト対応 | 常時 |
| BR-004 | 権限チェック | リモートアクセスには管理者権限が必要 | リモート操作時 |

### レジストリパス

| アーキテクチャ | レジストリパス |
|---------------|----------------|
| 32-bit | HKLM:\SOFTWARE\WOW6432Node\Microsoft\MSSQLServer\Client\ConnectTo |
| 64-bit | HKLM:\SOFTWARE\Microsoft\MSSQLServer\Client\ConnectTo |

### 計算ロジック

特に計算処理はない。

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

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

データベース操作はない。

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

該当なし。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | Warning | レジストリパス未存在 | 無視して続行 |
| - | Stop-Function | リモートコマンド実行失敗 | 権限・接続を確認 |

### リトライ仕様

本機能にリトライ機能はない。

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

レジストリ操作のため、データベーストランザクションは関与しない。レジストリ変更は即座に反映される。

## パフォーマンス要件

特になし。レジストリ操作は軽量。

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

- レジストリへの書き込み権限が必要
- リモートコンピューターへのアクセスには適切な認証が必要
- ShouldProcess対応で誤操作を防止

## 備考

- エイリアスはSQL Serverクライアント接続に使用されるため、削除後は接続に影響が出る可能性がある
- cliconfg.exeの代替として使用可能
- Get-DbaClientAliasとパイプで連携して一括削除可能

---

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

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

### 推奨読解順序

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

出力されるPSCustomObjectの構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Remove-DbaClientAlias.ps1 | `public/Remove-DbaClientAlias.ps1` | 出力オブジェクト構造（104-108行目） |

**読解のコツ**: 出力はComputerName、Architecture、Alias、Statusの4プロパティを持つシンプルなPSCustomObject。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Remove-DbaClientAlias.ps1 | `public/Remove-DbaClientAlias.ps1` | 関数定義とパラメータ構造 |

**主要処理フロー**:
1. **68-77行目**: param()ブロック
2. **78-114行目**: beginブロック（スクリプトブロック定義）
3. **116-128行目**: processブロック（リモート実行）

#### Step 3: スクリプトブロックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Remove-DbaClientAlias.ps1 | `public/Remove-DbaClientAlias.ps1` | リモート実行スクリプト |

**主要処理フロー**:
- **80行目**: Alias引数の取得
- **82行目**: 32bit/64bitレジストリパス定義
- **84-113行目**: エイリアス削除ループ
- **92-96行目**: アーキテクチャ判定
- **98-109行目**: エイリアス削除と結果オブジェクト生成

#### Step 4: リモート実行処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Remove-DbaClientAlias.ps1 | `public/Remove-DbaClientAlias.ps1` | Invoke-Command2呼び出し |

**主要処理フロー**:
- **118行目**: Test-ElevationRequirement
- **120-126行目**: ShouldProcess内でInvoke-Command2実行

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

```
Remove-DbaClientAlias
    │
    ├─ Test-ElevationRequirement (内部関数)
    │      └─ 管理者権限チェック
    │
    └─ Invoke-Command2
           └─ スクリプトブロック実行
                 ├─ Test-Path (レジストリパス確認)
                 ├─ Get-Item (レジストリキー取得)
                 └─ Remove-ItemProperty (エイリアス削除)
```

### データフロー図

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

ComputerName ──────────────┐
                           │
Credential ────────────────┼──▶ Remove-DbaClientAlias
                           │           │
Alias ─────────────────────┘           ├─ Test-ElevationRequirement
                                       │
                                       ├─ ShouldProcess確認
                                       │
                                       └─ Invoke-Command2
                                              │
                                              ├─ 32-bitレジストリチェック
                                              │     └─ Remove-ItemProperty
                                              │
                                              └─ 64-bitレジストリチェック
                                                    └─ Remove-ItemProperty
                                                          │
                                                          ▼
                                                   PSCustomObject
                                                   (ComputerName, Architecture,
                                                    Alias, Status)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Remove-DbaClientAlias.ps1 | `public/Remove-DbaClientAlias.ps1` | ソース | メイン関数定義 |
| Get-DbaClientAlias.ps1 | `public/Get-DbaClientAlias.ps1` | ソース | エイリアス取得（パイプライン元） |
| New-DbaClientAlias.ps1 | `public/New-DbaClientAlias.ps1` | ソース | エイリアス作成（関連機能） |
| Invoke-Command2.ps1 | `private/functions/Invoke-Command2.ps1` | ソース | リモートコマンド実行 |
| Test-ElevationRequirement.ps1 | `private/functions/Test-ElevationRequirement.ps1` | ソース | 権限チェック |
