# 画面設計書：27-データベース互換性

## 1. 基本情報

| 項目 | 内容 |
|------|------|
| 画面ID | 27 |
| 画面名 | データベース互換性 |
| カテゴリ | データベース |
| 対応コマンド | Get-DbaDbCompatibility |
| 関連機能No | 111 |

## 2. 概要・目的

データベースの互換性レベル設定を取得する機能です。SQL Serverのアップグレード計画時や、ベンダーアプリケーションのサポート要件確認時に、データベースがどの互換性レベルで動作しているかを監査するために使用します。

インスタンスアップグレード後も、データベースは古い互換性レベルを維持することが多いため、新機能の活用や互換性レベル更新が必要なデータベースを特定するのに役立ちます。

## 3. 機能説明

### 3.1 互換性レベルの概要

| 互換性レベル | SQL Serverバージョン |
|-------------|---------------------|
| 80 | SQL Server 2000 |
| 90 | SQL Server 2005 |
| 100 | SQL Server 2008/2008 R2 |
| 110 | SQL Server 2012 |
| 120 | SQL Server 2014 |
| 130 | SQL Server 2016 |
| 140 | SQL Server 2017 |
| 150 | SQL Server 2019 |
| 160 | SQL Server 2022 |

### 3.2 主要機能

- **互換性レベル取得**: データベースの現在の互換性レベルを取得
- **パイプライン対応**: Get-DbaDatabase等からの入力を受け付け
- **ワイルドカード対応**: データベース名のパターンマッチング

## 4. パラメータ仕様

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|-------------|------|
| SqlInstance | DbaInstanceParameter[] | No | - | 対象SQLインスタンス |
| SqlCredential | PSCredential | No | - | 認証資格情報 |
| Database | string[] | No | - | 対象データベース（ワイルドカード対応） |
| InputObject | Database[] | No | - | パイプライン入力（Get-DbaDatabase等から） |
| EnableException | switch | No | $false | 例外を有効化 |
| WhatIf | switch | No | - | 実行予定の表示 |
| Confirm | switch | No | - | 確認プロンプト |

## 5. 出力仕様

**型**: PSCustomObject

| プロパティ | 型 | 説明 |
|-----------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全修飾インスタンス名 |
| Database | string | データベース名 |
| DatabaseId | int | データベースID |
| Compatibility | int | 互換性レベル（80, 90, 100, 110, 120, 130, 140, 150, 160） |

## 6. 処理フロー

```
[開始]
    |
    v
[パラメータ検証]
    | - SqlInstanceまたはInputObject必須
    v
[SqlInstance指定時]
    | - Get-DbaDatabase呼び出し
    | - InputObjectに追加
    v
[データベースループ]
    |
    v
[SMOから情報取得]
    | - $db.CompatibilityLevel
    | - $db.Id
    v
[PSCustomObject出力]
    |
    v
[終了]
```

## 7. 内部実装詳細

### 7.1 パラメータ検証

```powershell
# Get-DbaDbCompatibility.ps1 行86-89
if (Test-Bound -not 'SqlInstance', 'InputObject') {
    Write-Message -Level Warning -Message "You must specify either a SQL instance or pipe a database collection"
    continue
}
```

### 7.2 Get-DbaDatabase呼び出し

```powershell
# Get-DbaDbCompatibility.ps1 行91-93
if ($SqlInstance) {
    $InputObject += Get-DbaDatabase -SqlInstance $SqlInstance -SqlCredential $SqlCredential -Database $Database
}
```

### 7.3 出力オブジェクト生成

```powershell
# Get-DbaDbCompatibility.ps1 行95-108
foreach ($db in $InputObject) {
    $server = $db.Parent
    $ServerVersion = $server.VersionMajor
    Write-Message -Level Verbose -Message "SQL Server is using Version: $ServerVersion"

    [PSCustomObject]@{
        ComputerName  = $server.ComputerName
        InstanceName  = $server.ServiceName
        SqlInstance   = $server.DomainInstanceName
        Database      = $db.Name
        DatabaseId    = $db.Id
        Compatibility = $db.CompatibilityLevel
    }
}
```

## 8. 使用例

### 8.1 基本的な使用

```powershell
# インスタンス上の全ユーザーデータベースの互換性レベルを取得
Get-DbaDbCompatibility -SqlInstance localhost\sql2017
```

### 8.2 特定データベースの指定

```powershell
# 特定データベースの互換性レベルを取得
Get-DbaDbCompatibility -SqlInstance localhost\sql2017 -Database Test
```

### 8.3 パイプライン入力

```powershell
# Get-DbaDatabase からパイプライン入力
Get-DbaDatabase -SqlInstance localhost\sql2017 | Get-DbaDbCompatibility
```

## 9. エラーハンドリング

| エラー状況 | 処理 | ソース位置 |
|-----------|------|-----------|
| SqlInstance/InputObjectなし | Warning出力してcontinue | Get-DbaDbCompatibility.ps1 行86-89 |

## 10. 関連コマンド

| コマンド | 関係 | 説明 |
|---------|------|------|
| Set-DbaDbCompatibility | 関連 | 互換性レベルを変更 |
| Get-DbaDatabase | 内部使用 | データベースオブジェクト取得 |

## 11. 注意事項・制約

1. **SMO依存**: SMO Database.CompatibilityLevelプロパティを使用
2. **アップグレード影響**: 互換性レベル変更はクエリ動作に影響する可能性
3. **最小互換性**: 各SQL Serverバージョンでサポートする最小互換性レベルがある
4. **WhatIf/Confirm**: パラメータは存在するが、読み取り専用コマンドなので実質不使用

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

### 12.1 関連ファイル一覧

| ファイル | 種類 | 行数 | 説明 |
|---------|------|------|------|
| public/Get-DbaDbCompatibility.ps1 | メインコマンド | 110 | 互換性レベル取得 |

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

```
Get-DbaDbCompatibility
    |
    +-- Test-Bound (パラメータ検証, 行86)
    +-- Get-DbaDatabase (InputObject取得, 行92)
    |       |
    |       +-- Connect-DbaInstance
    |
    +-- Write-Message (ログ出力, 行98)
```

### 12.3 データフロー図

```
[SqlInstance / InputObject]
    |
    +-- SqlInstance指定 --> Get-DbaDatabase --> InputObjectに追加
    +-- InputObject直接
    |
    v
[データベースループ]
    |
    | $db.CompatibilityLevel (SMOプロパティ)
    v
[PSCustomObject生成]
    |
    | ComputerName, InstanceName, SqlInstance,
    | Database, DatabaseId, Compatibility
    v
[出力]
```

### 12.4 読み解きの流れ

1. **processブロック (行85-109)**
   - パラメータ検証（行86-89）
   - SqlInstance指定時のGet-DbaDatabase呼び出し（行91-93）
   - データベースループと出力（行95-108）

## 13. 改訂履歴

| 日付 | バージョン | 変更内容 |
|------|-----------|---------|
| 2026-02-18 | 1.0 | 初版作成 |
