# 画面設計書 116-マイグレーション制約テスト

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおけるSQL Serverデータベース移行互換性検証機能の設計仕様を記述する。

### 本画面の処理概要

本機能は、データベース移行前にエディション固有の機能使用状況を検証し、移行可能性を事前に判定する。sys.dm_db_persisted_sku_featuresを使用してEnterprise/Developer版固有の機能を検出し、Standard/Express版への移行時の互換性問題を防止する。

**業務上の目的・背景**：開発環境（Developer版）から本番環境（Standard版）への移行、またはEnterprise版からStandard版へのライセンス最適化移行において、移行後の問題を事前に回避する。特にSQL Server 2016 SP1以降のエディション機能平準化を考慮した判定を行う。

**画面へのアクセス方法**：PowerShellコンソールまたはスクリプトから以下のコマンドレットを実行する。
- `Test-DbaMigrationConstraint` - 移行互換性の検証

**主要な操作・処理内容**：
1. 移行元と移行先のSQL Serverバージョン/エディション比較
2. FILESTREAMアクセスレベルの構成比較
3. sys.dm_db_persisted_sku_featuresによるエンタープライズ機能検出
4. CDC（Change Data Capture）とExpressエディションの互換性確認
5. データベース単位の移行可否判定

**画面遷移**：本機能はコマンドラインインターフェースであり、画面遷移は存在しない。

**権限による表示制御**：両サーバーでsysadmin権限が必要。sys.dm_db_persisted_sku_featuresへのアクセスが必要。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 292 | Test-DbaMigrationConstraint | 主機能 | 移行互換性の検証 |

## 画面種別

CLIコマンド（マイグレーション制約テスト）

## URL/ルーティング

```powershell
# 全データベースの移行可能性テスト
Test-DbaMigrationConstraint -Source <移行元> -Destination <移行先>

# 特定データベースのテスト
Test-DbaMigrationConstraint -Source <移行元> -Destination <移行先> -Database <DB名>

# データベース除外
Test-DbaMigrationConstraint -Source <移行元> -Destination <移行先> -ExcludeDatabase <除外DB>
```

## 入出力項目

### Test-DbaMigrationConstraint パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|---|------|-------------|------|
| Source | DbaInstance | Yes | - | 移行元SQL Serverインスタンス |
| SourceSqlCredential | PSCredential | No | - | 移行元認証資格情報 |
| Destination | DbaInstance | Yes | - | 移行先SQL Serverインスタンス |
| DestinationSqlCredential | PSCredential | No | - | 移行先認証資格情報 |
| Database | object[] | No | 全ユーザーDB | テスト対象データベース |
| ExcludeDatabase | object[] | No | - | テスト除外データベース |
| EnableException | switch | No | $false | 例外をスローする |

## 表示項目

### Test-DbaMigrationConstraint 出力

| プロパティ名 | 型 | 説明 |
|-------------|---|------|
| SourceInstance | string | 移行元インスタンス名 |
| DestinationInstance | string | 移行先インスタンス名 |
| SourceVersion | string | 移行元エディション・バージョン |
| DestinationVersion | string | 移行先エディション・バージョン |
| Database | string | データベース名 |
| FeaturesInUse | string | 使用中のエンタープライズ機能（カンマ区切り） |
| IsMigratable | bool | 移行可能フラグ |
| Notes | string | 移行可否の詳細メッセージ |

## イベント仕様

### 1-接続と初期検証

1. Connect-DbaInstanceで移行元に接続
2. Connect-DbaInstanceで移行先に接続
3. システムデータベース（master, msdb, tempdb）除外
4. バージョン検証:
   - SQL 2000からSQL 2012+への直接移行不可
   - 上位バージョンから下位バージョンへの移行不可
   - SQL 2008未満はサポート外

### 2-照合順序確認

1. 移行元と移行先のCollationを比較
2. 異なる場合は警告を出力

### 3-データベース別検証

各データベースに対して以下を実行:

1. **FILESTREAM検証**:
   - データベースにFileStreamDataFileGroupがあるか確認
   - 移行元と移行先のFilestreamAccessLevel比較
   - 不一致の場合は移行不可

2. **SKU機能検証**:
   - sys.dm_db_persisted_sku_featuresを照会
   - 使用中の機能をカンマ区切りで取得

3. **移行可否判定**（SQL 2016 SP1以降）:
   - Expressエディション + ChangeCapture = 移行不可
   - その他は機能平準化により移行可能

4. **移行可否判定**（SQL 2016 SP1未満）:
   - 移行先エディションの優先度が低く、機能使用あり = 移行不可
   - エディション優先度: Enterprise/Developer=10, Standard=5, Express=1

### 4-結果出力

各データベースについてPSCustomObjectを出力

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

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

本機能は読み取り専用であり、データベースへの更新は行わない。

| 操作（イベント） | 対象オブジェクト | 操作種別 | 概要 |
|----------------|-----------------|---------|------|
| 機能検出 | sys.dm_db_persisted_sku_features | SELECT | 機能使用状況の照会 |
| 構成確認 | sp_configure (FilestreamAccessLevel) | SELECT | FILESTREAM設定の照会 |

## メッセージ仕様

| メッセージ種別 | メッセージ内容 | 発生条件 |
|---------------|---------------|---------|
| エラー | Migrating system databases is not currently supported | システムDB指定時 |
| エラー | Sql Server 2000 databases cannot be migrated to SQL Server version 2012 and above | SQL 2000→2012+移行 |
| エラー | You can't migrate databases from a higher version to a lower one | 上位→下位バージョン |
| エラー | This function does not support versions lower than SQL Server 2008 | SQL 2008未満 |
| 警告 | Collation on $Source differs from the $Destination | 照合順序不一致 |
| 警告 | Database '$dbName' is offline or not accessible | オフラインDB |
| Info | Database can be migrated | 移行可能 |
| Info | Database cannot be migrated | 移行不可 |

## 例外処理

| 例外状況 | 処理内容 |
|---------|---------|
| 接続失敗 | Stop-Functionでエラー出力 |
| システムDB指定 | Stop-Functionでエラー出力、return |
| バージョン不整合 | Stop-Functionでエラー出力、return |
| SKU機能照会失敗 | Stop-Functionでエラー出力、Continue |

## 備考

- SQL Server 2008+で使用可能（sys.dm_db_persisted_sku_featuresの存在）
- SQL Server 2016 SP1で多くのエンタープライズ機能がStandardに追加
- 検出可能な機能例: Compression, Partitioning, ChangeCapture, XTP（インメモリ）
- Expressエディションは特にCDC非対応（SQL Agentなし）
- オフラインDBはスキップされる
- FILESTREAMはRunningValue（実行値）で比較

---

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

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

### 推奨読解順序

#### Step 1: エディション優先度を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Test-DbaMigrationConstraint.ps1 | `public/Test-DbaMigrationConstraint.ps1` | 行125-131: $editions辞書 |

**読解のコツ**: Enterprise/Developer=10, Standard=5, Express=1の重み付け。移行先の重みが低いと制約が厳しくなる。

#### Step 2: 初期検証フローを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Test-DbaMigrationConstraint.ps1 | `public/Test-DbaMigrationConstraint.ps1` | 行157-165: システムDB除外、バージョン検証 |
| 2-2 | Test-DbaMigrationConstraint.ps1 | `public/Test-DbaMigrationConstraint.ps1` | 行167-169: 照合順序比較 |
| 2-3 | Test-DbaMigrationConstraint.ps1 | `public/Test-DbaMigrationConstraint.ps1` | 行171-180: バージョン検証継続 |

**主要処理フロー**:
1. **行162-165**: SQL 2000→2012+直接移行不可
2. **行171-175**: 上位→下位バージョン移行不可
3. **行177-180**: SQL 2008未満サポート外

#### Step 3: FILESTREAM検証を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Test-DbaMigrationConstraint.ps1 | `public/Test-DbaMigrationConstraint.ps1` | 行202-222: FILESTREAM検証 |

**主要処理フロー**:
1. **行204**: FileStreamDataFileGroup存在確認
2. **行206-207**: 両サーバーのFilestreamAccessLevel取得
3. **行209-221**: RunningValue比較と結果出力

#### Step 4: SKU機能検証を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Test-DbaMigrationConstraint.ps1 | `public/Test-DbaMigrationConstraint.ps1` | 行224-240: SKU機能照会 |
| 4-2 | Test-DbaMigrationConstraint.ps1 | `public/Test-DbaMigrationConstraint.ps1` | 行242-271: SQL 2016 SP1以降の判定 |
| 4-3 | Test-DbaMigrationConstraint.ps1 | `public/Test-DbaMigrationConstraint.ps1` | 行273-303: SQL 2016 SP1未満の判定 |

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

```
Test-DbaMigrationConstraint
    │
    +-- Connect-DbaInstance (Source)
    │
    +-- Connect-DbaInstance (Destination)
    │
    +-- バージョン検証
    │       ├─ SQL 2000→2012+チェック
    │       ├─ 上位→下位バージョンチェック
    │       └─ SQL 2008最低バージョンチェック
    │
    +-- 照合順序比較
    │       └─ 不一致時警告
    │
    +-- foreach ($db in $Database)
            │
            +-- FILESTREAM検証
            │       ├─ FileStreamDataFileGroup存在確認
            │       ├─ Get-DbaSpConfigure -ConfigName FilestreamAccessLevel
            │       └─ RunningValue比較
            │
            +-- SKU機能検出
            │       └─ sys.dm_db_persisted_sku_features照会
            │
            +-- 移行可否判定
            │       ├─ SQL 2016 SP1+: Express+CDCチェック
            │       └─ SQL 2016 SP1未満: エディション優先度比較
            │
            └── PSCustomObject出力
                    ├─ SourceInstance
                    ├─ DestinationInstance
                    ├─ Database
                    ├─ FeaturesInUse
                    ├─ IsMigratable
                    └─ Notes
```

### データフロー図

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

Source ──────────────────> Connect-DbaInstance ─────────────────>
Destination ─────────────> Connect-DbaInstance ─────────────────>

Database(指定/全DB) ─────> FILESTREAM検証 ──────────────────────>
                            │
                            └─ FilestreamAccessLevel比較

                          SKU機能検出 ────────────────────────────>
                            │
                            └─ dm_db_persisted_sku_features

                          エディション判定 ───────────────────────> PSCustomObject
                            │                                      ├─ Database
                            ├─ SQL 2016 SP1+                       ├─ FeaturesInUse
                            │   └─ Express + CDC = NG              ├─ IsMigratable
                            └─ SQL 2016 SP1未満                    └─ Notes
                                └─ 優先度比較
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Test-DbaMigrationConstraint.ps1 | `public/Test-DbaMigrationConstraint.ps1` | ソース | 移行互換性検証 |
| Get-DbaSpConfigure.ps1 | `public/Get-DbaSpConfigure.ps1` | ソース | sp_configure取得（FILESTREAM用） |
