# 画面設計書 243-照合順序テスト

## 概要

本ドキュメントは、dbatools PowerShellモジュールの `Test-DbaDbCollation` コマンドに関する画面設計書です。データベースの照合順序がSQL Serverインスタンスのデフォルト照合順序と一致しているかをテストする機能を提供します。

### 本画面の処理概要

`Test-DbaDbCollation` コマンドは、各データベースの照合順序をSQL Serverインスタンスのデフォルト照合順序と比較し、一致・不一致を判定する機能を提供します。

**業務上の目的・背景**：データベースの照合順序がインスタンスのデフォルトと異なる場合、クロスデータベースクエリ実行時に照合順序の競合エラーが発生したり、一時テーブルとの結合で問題が生じることがあります。マイグレーション前の事前チェック、環境統一化の監査、アプリケーションの不具合原因調査などにおいて、照合順序の一貫性確認は重要です。本コマンドは、複数データベースの照合順序整合性を一括で確認し、問題箇所を特定するための支援を提供します。

**画面へのアクセス方法**：PowerShellコンソールまたはPowerShell ISEから `Test-DbaDbCollation` コマンドを直接実行します。SqlInstanceパラメータでターゲットを指定し、必要に応じてDatabase/ExcludeDatabaseパラメータでフィルタリングします。

**主要な操作・処理内容**：
1. SQL Serverインスタンスへの接続
2. アクセス可能なデータベース一覧の取得
3. Database/ExcludeDatabaseパラメータによるフィルタリング
4. 各データベースの照合順序とインスタンスのデフォルト照合順序を比較
5. 比較結果（IsEqual: True/False）の出力

**画面遷移**：CLIコマンドのため画面遷移はありません。出力を他のコマンドにパイプラインで渡すことが可能です。Registered Serverと連携して複数サーバーに対して実行可能です。

**権限による表示制御**：データベースへのアクセス権限が必要です。IsAccessibleプロパティで確認できるデータベースのみが対象となります。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 242 | Test-DbaDbCollation | 主機能 | データベース照合順序のテスト |
| - | Connect-DbaInstance | 補助機能 | SQL Serverインスタンスへの接続 |
| - | Get-DbaRegServer | 補助機能 | 登録済みサーバーからの入力対応 |

## 画面種別

CLI（コマンドラインインターフェース）/ テスト・検証系

## URL/ルーティング

PowerShellコマンド: `Test-DbaDbCollation`

## 入出力項目

### 入力パラメータ

| パラメータ名 | 型 | 必須 | パイプライン | 説明 |
|-------------|----|----|-------------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | Yes | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | No | SQL Server認証用の資格情報 |
| Database | object[] | No | No | テスト対象データベース（ワイルドカード可） |
| ExcludeDatabase | object[] | No | No | 除外するデータベース |
| EnableException | switch | No | No | 例外を詳細表示するフラグ |

## 表示項目

### 出力オブジェクト（PSCustomObject）

| 項目名 | 型 | 説明 |
|--------|----|----|
| ComputerName | string | SQL Serverホストのコンピュータ名 |
| InstanceName | string | SQL Serverサービス名 |
| SqlInstance | string | 完全修飾SQL Serverインスタンス名 |
| Database | string | データベース名 |
| ServerCollation | string | SQL Serverインスタンスのデフォルト照合順序 |
| DatabaseCollation | string | データベースの照合順序 |
| IsEqual | bool | 照合順序が一致するかどうか（True: 一致、False: 不一致） |

## イベント仕様

### 1-コマンド実行

コマンド実行時の処理フロー:

1. **接続処理**: `Connect-DbaInstance` でSQL Serverに接続
2. **データベース取得**: `$server.Databases` からIsAccessibleなデータベースを取得
3. **フィルタリング**: Databaseパラメータで絞り込み、ExcludeDatabaseで除外
4. **比較処理**: 各データベースのcollationプロパティと$server.collationを比較
5. **結果出力**: PSCustomObjectとして比較結果を出力

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| コマンド実行 | - | SELECT | データベースへの書き込みなし（読み取り専用） |

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

本コマンドはデータベースへの更新を行いません。SMOを介してデータベースメタデータを取得するのみです。

## メッセージ仕様

| メッセージID | レベル | メッセージ内容 | 発生条件 |
|-------------|--------|--------------|----------|
| - | Error | Failure | SQL Server接続に失敗した場合 |
| - | Verbose | Processing {db.name} on {servername}. | 各データベース処理時 |

## 例外処理

| 例外種別 | 発生条件 | 処理内容 |
|---------|---------|---------|
| 接続エラー | SQL Serverへの接続失敗 | Stop-Functionでエラー記録、次のインスタンスへ続行 |

## 備考

- IsAccessibleプロパティがTrueのデータベースのみが対象
- Databaseパラメータはワイルドカードによるパターンマッチング可能
- Central Management Server（Get-DbaRegServer）からのパイプライン入力をサポート
- 照合順序が異なるデータベースはIsEqual: Falseとして出力される
- システムデータベース（master, model, msdb, tempdb）も対象となる

---

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

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

### 推奨読解順序

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

出力オブジェクトの構造を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Test-DbaDbCollation.ps1 | `public/Test-DbaDbCollation.ps1` | 44-56行目: .OUTPUTSセクションで出力プロパティ定義 |
| 1-2 | Test-DbaDbCollation.ps1 | `public/Test-DbaDbCollation.ps1` | 107-115行目: PSCustomObjectの構造 |

**読解のコツ**: IsEqualプロパティがbool値で、照合順序の一致/不一致を示す点に注目。

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

処理の起点となる関数の構造を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Test-DbaDbCollation.ps1 | `public/Test-DbaDbCollation.ps1` | 78-86行目: パラメータ定義 |
| 2-2 | Test-DbaDbCollation.ps1 | `public/Test-DbaDbCollation.ps1` | 87-117行目: processブロックのメインロジック |

**主要処理フロー**:
1. **88-93行目**: Connect-DbaInstanceでSQL Server接続
2. **95行目**: `$server.Databases | Where-Object IsAccessible` でアクセス可能DB取得
3. **97-99行目**: Databaseパラメータによるフィルタリング
4. **101-103行目**: ExcludeDatabaseパラメータによる除外
5. **105-116行目**: 各DBの照合順序比較と結果出力

#### Step 3: 比較ロジックを理解する

照合順序の比較処理を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Test-DbaDbCollation.ps1 | `public/Test-DbaDbCollation.ps1` | 114行目: `$db.collation -eq $server.collation` の比較式 |

**主要処理フロー**:
- **112行目**: `$server.collation` - インスタンスのデフォルト照合順序
- **113行目**: `$db.collation` - 各データベースの照合順序
- **114行目**: 文字列比較で一致/不一致を判定

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

```
Test-DbaDbCollation
    │
    ├─ Connect-DbaInstance
    │      └─ SQL Server接続確立
    │
    └─ $server.Databases
           │
           ├─ Where-Object IsAccessible
           │
           ├─ Where-Object (Database filter)
           │
           ├─ Where-Object Name -NotIn $ExcludeDatabase
           │
           └─ foreach ($db)
                  └─ [PSCustomObject] 出力
```

### データフロー図

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

SqlInstance ───▶ Connect-DbaInstance ───▶ $server オブジェクト
Database ───▶                                    │
ExcludeDatabase ───▶                             ▼
                         $server.Databases (IsAccessible)
                                    │
                                    ▼
                         Database フィルタリング
                                    │
                                    ▼
                         ExcludeDatabase 除外
                                    │
                                    ▼
                    各データベースの照合順序を比較
                    $db.collation vs $server.collation
                                    │
                                    ▼
                              PSCustomObject
                    (ComputerName, InstanceName, SqlInstance,
                     Database, ServerCollation, DatabaseCollation,
                     IsEqual)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Test-DbaDbCollation.ps1 | `public/Test-DbaDbCollation.ps1` | ソース | メインコマンド実装 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続 |
| Get-DbaRegServer.ps1 | `public/Get-DbaRegServer.ps1` | ソース | 登録済みサーバー取得（パイプライン連携） |
