# 画面設計書 78-ディストリビューター管理

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおける「ディストリビューター管理」機能の設計書です。SQL Server レプリケーションのディストリビューター構成の取得・有効化・無効化を行うコマンド群について記述します。

### 本画面の処理概要

本機能は、SQL Server レプリケーショントポロジにおけるディストリビューターの管理機能を提供します。ディストリビューターは、レプリケーションデータの配布を担当する中央コンポーネントです。

**業務上の目的・背景**：SQL Server レプリケーション環境において、ディストリビューターはパブリッシャーからサブスクライバーへのデータ配布を管理する重要な役割を担います。本機能により、ディストリビューターの構成状況の確認、新しいディストリビューターの設定、不要になったディストリビューターの削除が可能です。これは、レプリケーショントポロジの初期設定、環境移行、トラブルシューティングに不可欠です。

**画面へのアクセス方法**：PowerShellコンソールから `Get-DbaReplDistributor`、`Enable-DbaReplDistributor`、`Disable-DbaReplDistributor` コマンドを直接実行します。

**主要な操作・処理内容**：
1. `Get-DbaReplDistributor`: ディストリビューター構成情報の取得
2. `Enable-DbaReplDistributor`: ディストリビューターの有効化
3. `Disable-DbaReplDistributor`: ディストリビューターの無効化

**画面遷移**：本機能はCLIコマンドのため画面遷移は存在しません。`Get-DbaReplDistributor` は内部的に `Get-DbaReplServer` を呼び出してディストリビューター情報を取得します。

**権限による表示制御**：ディストリビューター管理には sysadmin 権限または distribution データベースの db_owner 権限が必要です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 445 | Get-DbaReplDistributor | 主機能 | ディストリビューターの取得 |
| 440 | Enable-DbaReplDistributor | 主機能 | ディストリビューターの有効化 |
| 438 | Disable-DbaReplDistributor | 主機能 | ディストリビューターの無効化 |

## 画面種別

一覧 / 管理（ディストリビューター構成の取得および管理操作）

## URL/ルーティング

PowerShellコマンド:
- `Get-DbaReplDistributor`
- `Enable-DbaReplDistributor`
- `Disable-DbaReplDistributor`

## 入出力項目

### Get-DbaReplDistributor 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | 代替認証情報 |
| EnableException | switch | No | 例外を有効化 |

## 表示項目

### Get-DbaReplDistributor 出力プロパティ

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | SQL Serverインスタンスのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| IsPublisher | bool | パブリッシャーとして構成されているか |
| IsDistributor | bool | ディストリビューターとして構成されているか |
| DistributionServer | string | ディストリビューターサーバー名 |
| DistributionDatabase | string | ディストリビューションデータベース名 |
| DistributorInstalled | bool | ディストリビューターコンポーネントがインストールされているか |
| DistributorAvailable | bool | ディストリビューターが利用可能か |
| HasRemotePublisher | bool | リモートパブリッシャーが構成されているか |

## イベント仕様

### 1-Get-DbaReplDistributor実行

1. Test-FunctionInterrupt でキャンセルチェック
2. Get-DbaReplServer を呼び出してレプリケーションサーバー情報を取得
3. Select-DefaultView でディストリビューター関連プロパティを選択して出力

### 2-Enable-DbaReplDistributor実行

1. 対象インスタンスへの接続
2. ディストリビューションデータベースの作成
3. ディストリビューターとしての登録
4. 結果を返却

### 3-Disable-DbaReplDistributor実行

1. 対象インスタンスへの接続
2. アクティブなパブリケーション/サブスクリプションの確認
3. ディストリビューター登録の解除
4. ディストリビューションデータベースの削除
5. 結果を返却

## データベース更新仕様

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| Get-DbaReplDistributor実行 | msdb.dbo.MSdistributors | SELECT | ディストリビューター情報の取得 |
| Enable-DbaReplDistributor実行 | master.sys.databases | INSERT | distributionデータベースの作成 |
| Enable-DbaReplDistributor実行 | msdb.dbo.MSdistributors | INSERT | ディストリビューター登録 |
| Disable-DbaReplDistributor実行 | msdb.dbo.MSdistributors | DELETE | ディストリビューター登録解除 |
| Disable-DbaReplDistributor実行 | master.sys.databases | DELETE | distributionデータベースの削除 |

### テーブル別更新項目詳細

#### msdb.dbo.MSdistributors

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | name, distribution_db | すべてのディストリビューター | Get-DbaReplDistributor |
| INSERT | name, distribution_db | Enable-DbaReplDistributor | ディストリビューター登録 |
| DELETE | name | Disable-DbaReplDistributor | ディストリビューター登録解除 |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|---------------|---------|
| MSG-001 | エラー | Error occurred getting information about $instance | 情報取得失敗時 |
| MSG-002 | 情報 | Getting publisher for $server | パブリッシャー情報取得時（Verbose） |
| MSG-003 | 情報 | Attempting to retrieve distributor information from $instance | 処理開始時（Verbose） |

## 例外処理

| 例外種別 | 発生条件 | 処理内容 |
|---------|---------|---------|
| ConnectionError | SQL Serverへの接続失敗 | Stop-Function で処理を停止 |
| DistributorInUse | 使用中のディストリビューターの無効化試行 | エラーメッセージを表示 |

## 備考

- Get-DbaReplDistributor は内部的に Get-DbaReplServer を呼び出す
- IsDistributor が True の場合のみ、DistributionServer と DistributionDatabase に値が設定される
- HasRemotePublisher は、ローカル以外のパブリッシャーが構成されているかを示す
- ディストリビューターの無効化前に、すべてのパブリケーションとサブスクリプションを削除する必要がある

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaReplDistributor.ps1 | `public/Get-DbaReplDistributor.ps1` | 出力プロパティの定義（行26-48） |

**読解のコツ**: Get-DbaReplServer の出力を拡張し、ディストリビューター関連プロパティを Select-DefaultView で選択している点に注目。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaReplDistributor.ps1 | `public/Get-DbaReplDistributor.ps1` | param ブロック（行72-77）と Get-DbaReplServer 呼び出し（行85） |

**主要処理フロー**:
1. **行79**: Test-FunctionInterrupt でキャンセルチェック
2. **行81**: Verbose メッセージ出力
3. **行85**: Get-DbaReplServer 呼び出し（ディストリビューター情報取得）
4. **行91**: Select-DefaultView で出力整形

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

```
Get-DbaReplDistributor
    |
    +-- Test-FunctionInterrupt (キャンセルチェック)
    |
    +-- Write-Message (Verbose メッセージ)
    |
    +-- Get-DbaReplServer (レプリケーションサーバー情報取得)
    |       |
    |       +-- Add-ReplicationLibrary
    |       +-- Connect-DbaInstance
    |       +-- New Microsoft.SqlServer.Replication.ReplicationServer
    |
    +-- Select-DefaultView (出力整形)
            +-- IsPublisher
            +-- IsDistributor
            +-- DistributionServer
            +-- DistributionDatabase
            +-- DistributorInstalled
            +-- DistributorAvailable
            +-- HasRemotePublisher
```

### データフロー図

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

SqlInstance  ───+
                |
SqlCredential ──+──> Get-DbaReplServer ─────> ReplicationServer Object
                |
                +──> Select-DefaultView ────> Filtered Properties

ReplicationServer ──> ディストリビューター情報抽出 ──> Pipeline Output
                      (IsDistributor,
                       DistributionServer,
                       DistributionDatabase,
                       DistributorInstalled,
                       DistributorAvailable,
                       HasRemotePublisher)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaReplDistributor.ps1 | `public/Get-DbaReplDistributor.ps1` | ソース | ディストリビューター取得 |
| Enable-DbaReplDistributor.ps1 | `public/Enable-DbaReplDistributor.ps1` | ソース | ディストリビューター有効化 |
| Disable-DbaReplDistributor.ps1 | `public/Disable-DbaReplDistributor.ps1` | ソース | ディストリビューター無効化 |
| Get-DbaReplServer.ps1 | `public/Get-DbaReplServer.ps1` | ソース | レプリケーションサーバー取得（内部呼び出し） |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続処理 |
