# 画面設計書 177-機能使用状況

## 概要

本ドキュメントは、dbatools PowerShellモジュールの `Get-DbaDbFeatureUsage` コマンドの機能仕様を定義した画面設計書です。

### 本画面の処理概要

本コマンドは、データベースで使用されているSQL Server Enterpriseエディション専用機能を検出し、Standardエディションへのダウングレード計画を支援します。

**業務上の目的・背景**：SQL Server EnterpriseエディションからStandardエディションへのダウングレードや、異なるエディションの環境へのデータベース移行を計画する際、Enterpriseエディション専用機能（カラムストアインデックス、テーブルパーティション、透過的データ暗号化など）が使用されているかを把握する必要があります。本コマンドを使用することで、DBAはダウングレードを阻害する機能を特定し、必要な修正手順を計画できます。

**画面へのアクセス方法**：PowerShellコンソールまたはスクリプトから `Get-DbaDbFeatureUsage` コマンドを実行します。SqlInstanceパラメータまたはGet-DbaDatabaseからのパイプライン入力を使用します。

**主要な操作・処理内容**：
1. 指定されたSQL Serverインスタンスまたはデータベースオブジェクトからデータベースを取得
2. 各データベースに対してsys.dm_db_persisted_sku_features動的管理ビューをクエリ
3. 使用中のEnterprise機能のID、名前、データベース情報を取得
4. 結果をパイプラインに出力

**画面遷移**：本コマンドは `Get-DbaDatabase` からパイプライン入力を受け取ることができます。出力結果は `Format-Table`、`Export-Csv` などの他のPowerShellコマンドにパイプで渡すことができます。

**権限による表示制御**：sys.dm_db_persisted_sku_features動的管理ビューへのVIEW DATABASE STATE権限が必要です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 103 | Get-DbaDbFeatureUsage | 主機能 | データベース機能使用状況の取得 |

## 画面種別

コマンドライン出力（一覧表示）

## URL/ルーティング

PowerShellコマンド: `Get-DbaDbFeatureUsage`

## 入出力項目

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|---|------|------|
| SqlInstance | DbaInstanceParameter[] | No | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | 認証用資格情報 |
| Database | string[] | No | 対象データベース（ワイルドカード対応） |
| ExcludeDatabase | string[] | No | 除外データベース（ワイルドカード対応） |
| InputObject | Database[] | No | パイプライン入力（Databaseオブジェクト） |
| EnableException | switch | No | 例外処理モードの有効化 |

## 表示項目

| 項目名 | 型 | 説明 |
|--------|---|------|
| ComputerName | string | SQL Serverホストのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名（デフォルトインスタンスはMSSQLSERVER） |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| Id | int | 機能ID（sys.dm_db_persisted_sku_featuresより） |
| Feature | string | 使用中のEnterprise機能名 |
| Database | string | 機能が検出されたデータベース名 |

## イベント仕様

### 1-コマンド実行

1. SqlInstanceまたはInputObjectパラメータを検証
2. SqlInstanceが指定された場合、Get-DbaDatabaseでデータベースを取得
3. 各データベースのアクセス可能性を確認
4. sys.dm_db_persisted_sku_featuresに対してSELECTクエリを実行
5. 結果をそのままパイプラインに出力（SQLクエリがオブジェクト形式で返す）

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| コマンド実行 | sys.dm_db_persisted_sku_features | SELECT | Enterprise機能使用状況の取得 |

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

本コマンドは読み取り専用であり、データベースの更新は行いません。

## メッセージ仕様

| メッセージID | 種別 | 条件 | メッセージ内容 |
|-------------|------|------|--------------|
| M001 | Verbose | データベース処理中 | "Processing {db} on {server}" |
| M002 | Warning | データベースアクセス不可 | "The database {db} is not accessible. Skipping database." |
| M003 | Error | クエリ実行失敗 | "Failure" |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| データベースアクセス不可 | Stop-Functionでエラーを出力し、次のデータベースに継続 |
| クエリ実行エラー | Stop-Functionでエラーを出力し、次のデータベースに継続 |

## 備考

- Enterprise機能が検出されない場合、出力はありません
- 検出される可能性のあるEnterprise機能例：
  - Columnstore Index（カラムストアインデックス）
  - Table Partitioning（テーブルパーティション）
  - Transparent Data Encryption（透過的データ暗号化）
  - In-Memory OLTP（インメモリOLTP）
  - Compression（圧縮）

---

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

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

### 推奨読解順序

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

SQLクエリで直接返されるデータ構造を理解します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaDbFeatureUsage.ps1 | `public/Get-DbaDbFeatureUsage.ps1` | 88-91行目：SQLクエリ定義 |

**読解のコツ**: クエリ結果がそのままオブジェクトとして返されるため、SELECT句のエイリアスが出力プロパティとなります。

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

processブロックの処理フローを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaDbFeatureUsage.ps1 | `public/Get-DbaDbFeatureUsage.ps1` | 94-111行目：processブロック |

**主要処理フロー**:
1. **95-97行目**: SqlInstanceからデータベースを取得してInputObjectに追加
2. **98-99行目**: 各データベースをループ処理
3. **101-103行目**: アクセス可能性チェック
4. **105-108行目**: クエリ実行と結果出力

#### Step 3: SQLクエリを理解する

sys.dm_db_persisted_sku_featuresから機能情報を取得するクエリを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaDbFeatureUsage.ps1 | `public/Get-DbaDbFeatureUsage.ps1` | 88-91行目：クエリ本体 |

**クエリ解説**:
```sql
SELECT SERVERPROPERTY('MachineName') AS ComputerName,
       ISNULL(SERVERPROPERTY('InstanceName'), 'MSSQLSERVER') AS InstanceName,
       SERVERPROPERTY('ServerName') AS SqlInstance,
       feature_id AS Id,
       feature_name AS Feature,
       DB_NAME() AS [Database]
FROM sys.dm_db_persisted_sku_features
```

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

```
Get-DbaDbFeatureUsage
    |
    +-- begin (SQLクエリ定義)
    |
    +-- process
           |
           +-- Get-DbaDatabase (SqlInstance指定時)
           |
           +-- foreach ($db in $InputObject)
                  |
                  +-- IsAccessible チェック
                  |
                  +-- $db.Query($sql)
```

### データフロー図

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

SqlInstance/       Get-DbaDatabase        $db.Query()
InputObject   ---> でDB一覧取得     ---> sys.dm_db_persisted ---> クエリ結果
                        |                _sku_features           (そのまま出力)
                        v
                   各データベース
                   をループ処理
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaDbFeatureUsage.ps1 | `public/Get-DbaDbFeatureUsage.ps1` | ソース | メイン関数実装 |
| Get-DbaDatabase.ps1 | `public/Get-DbaDatabase.ps1` | ソース | データベースオブジェクト取得 |
