# 機能設計書 254-Test-DbaTempDbConfig

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおける`Test-DbaTempDbConfig`コマンドレットの機能設計書です。tempdbの構成をSQL Serverベストプラクティスに対してテストし、各ルールの準拠状況を返却します。

### 本機能の処理概要

`Test-DbaTempDbConfig`コマンドは、SQL Serverのtempdbデータベースの構成を複数のベストプラクティスルールに対して検証し、各ルールに対する現在設定・推奨設定・準拠状況を詳細にレポートします。

**業務上の目的・背景**：tempdbはSQL Serverのシステムデータベースであり、一時テーブル、並べ替え、ハッシュ操作などに使用されます。tempdbの構成がベストプラクティスに準拠していない場合、パフォーマンス問題や競合が発生する可能性があります。本機能は、DBAがtempdbの構成を手動でチェックする手間を省き、複数のベストプラクティス項目を一括で検証できるようにします。

**機能の利用シーン**：
- SQL Server健全性チェックの一環
- パフォーマンストラブルシューティング
- コンプライアンス監査
- 新規サーバーセットアップの検証
- tempdb構成変更後の確認

**主要な処理内容**：
1. 対象SQL Serverへの接続とtempdbファイル情報の取得
2. 6つのベストプラクティスルールに対する評価
3. 各ルールの現在値・推奨値・準拠状況の出力

**関連システム・外部連携**：SMOを使用してtempdbファイル情報を取得し、DBCC TRACESTATUSでトレースフラグを確認します。

**権限による制御**：VIEW SERVER STATE権限が必要です（DBCC TRACESTATUS実行のため）。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | 本機能はPowerShellコマンドレットであり、関連するGUI画面はありません |

## 機能種別

バリデーション / 構成監査

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstance[] | Yes | テスト対象のSQL Serverインスタンス | パイプライン入力可能 |
| SqlCredential | PSCredential | No | 代替認証情報 | Get-Credentialで生成 |
| EnableException | switch | No | 例外を有効にする | - |

### 入力データソース

- PowerShellコマンドラインからの直接入力
- パイプライン経由での入力

## 出力仕様

### 出力データ

インスタンスごとに6つのPSCustomObjectを出力（各ルールに1つ）：

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverインスタンスのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| Rule | string | 評価されたルール名 |
| Recommended | bool/int | 推奨値（ルールにより型が異なる） |
| CurrentSetting | bool/int | 現在の設定値 |
| IsBestPractice | bool | ベストプラクティスに準拠している場合$true |
| Notes | string | ルールの説明と推奨事項 |

### 評価ルール一覧

| Rule名 | 推奨値 | 説明 |
|--------|-------|------|
| TF 1118 Enabled | $true（SQL 2012以下）/ $false（SQL 2016以上） | トレースフラグ1118の有効化状態 |
| File Count | min(8, プロセッサ数) | tempdbデータファイル数 |
| File Growth in Percent | $false | パーセント成長の使用有無 |
| File Location | $false | C:ドライブへの配置有無 |
| File MaxSize Set | $false | 最大サイズ制限の設定有無 |
| Data File Size Equal | $true | データファイルサイズの均等性 |

### 出力先

- PowerShellパイプライン（PSCustomObject[]）
- コンソール表示

## 処理フロー

### 処理シーケンス

```
1. process ブロック
   └─ 各SqlInstanceに対してループ処理
      ├─ Connect-DbaInstance（MinimumVersion 9 = SQL 2005以上）
      ├─ 接続エラー時はStop-FunctionでContinue
      │
      ├─ TF 1118評価
      │   ├─ DBCC TRACESTATUS実行
      │   ├─ SQL 2016以上は自動有効のためtrue
      │   └─ SQL 2012以下は有効化推奨
      │
      ├─ Get-DbaDbFileでtempdbファイル取得
      │   ├─ データファイルとログファイル分離
      │
      ├─ File Count評価
      │   └─ データファイル数とmin(8, プロセッサ数)比較
      │
      ├─ File Growth評価
      │   └─ GrowthType != 'KB'のファイル検出
      │
      ├─ File Location評価
      │   └─ C:*パスのファイル検出
      │
      ├─ File MaxSize評価
      │   └─ MaxSize > 0のファイル検出
      │
      └─ Data File Size Equal評価
          └─ 全データファイルのサイズ一致確認
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{SqlInstanceループ}
    B -->|次のインスタンス| C[Connect-DbaInstance]
    C -->|成功| D[DBCC TRACESTATUS実行]
    C -->|失敗| E[Stop-Function/Continue]
    E --> B
    D --> F[TF 1118評価出力]
    F --> G[Get-DbaDbFile]
    G --> H[File Count評価出力]
    H --> I[File Growth評価出力]
    I --> J[File Location評価出力]
    J --> K[File MaxSize評価出力]
    K --> L[Data File Size Equal評価出力]
    L --> B
    B -->|完了| M[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | 最小バージョン | SQL Server 2005（バージョン9）以上が必要 | 接続時 |
| BR-002 | TF 1118判定 | SQL 2016以上は自動有効のためIsBestPractice=true | VersionMajor > 12 |
| BR-003 | ファイル数推奨 | min(8, 論理プロセッサ数)がベストプラクティス | 常に適用 |
| BR-004 | 成長設定 | KB単位での明示的成長が推奨 | 常に適用 |
| BR-005 | 配置場所 | C:ドライブ以外が推奨 | 常に適用 |
| BR-006 | サイズ制限 | 最大サイズ無制限が推奨 | 常に適用 |
| BR-007 | サイズ均等 | 全データファイル同サイズが推奨 | 常に適用 |

### 計算ロジック

- **File Count推奨値**: `[Math]::Min(8, $server.Processors)`
- **IsBestPractice判定**: CurrentSetting == Recommended

## データベース操作仕様

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| トレースフラグ確認 | - | DBCC | DBCC TRACEON/TRACESTATUS実行 |
| ファイル情報取得 | sys.database_files | SELECT | Get-DbaDbFile経由 |

### テーブル別操作詳細

#### DBCC TRACESTATUS

| 操作 | 項目 | 取得条件 | 備考 |
|-----|-----|---------|------|
| DBCC | TraceFlag | -1指定で全トレースフラグ | 1118の存在確認 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| ConnectionError | 接続エラー | SQL Serverへの接続失敗 | Stop-FunctionでスキップしてContinue |

### リトライ仕様

本機能にはリトライ機能はありません。

## トランザクション仕様

本機能は読み取り専用であり、トランザクション管理は不要です。

## パフォーマンス要件

- 各インスタンスの評価は通常数秒以内に完了
- 6つのルール評価結果をストリーミング出力

## セキュリティ考慮事項

- VIEW SERVER STATE権限が必要（DBCC実行のため）
- 読み取り専用操作のため変更リスクなし

## 備考

- KB328551: TF 1118のパフォーマンス効果について
- SQL Server 2016以降はTF 1118の機能がデフォルトで有効
- Amit Bannerjeeの実装を参考にしている

---

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

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

### 推奨読解順序

#### Step 1: パラメータとエントリーポイントを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Test-DbaTempDbConfig.ps1 | `public/Test-DbaTempDbConfig.ps1` | 関数全体の構造とパラメータ定義 |

**主要処理フロー**:
1. **92-98行目**: パラメータ定義
2. **99-243行目**: processブロック

#### Step 2: TF 1118評価ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Test-DbaTempDbConfig.ps1 | `public/Test-DbaTempDbConfig.ps1` | 107-133行目：TF 1118評価 |

**主要処理フロー**:
- **108行目**: DBCC TRACEON/TRACESTATUSクエリ実行
- **109行目**: 1118の存在確認
- **111-133行目**: SQL Serverバージョンに応じた判定分岐

#### Step 3: ファイル関連評価を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Test-DbaTempDbConfig.ps1 | `public/Test-DbaTempDbConfig.ps1` | 137-241行目：各ファイル評価 |

**主要処理フロー**:
- **138行目**: Get-DbaDbFileでtempdbファイル取得
- **139-140行目**: データファイルとログファイルの分離
- **143-152行目**: File Count評価
- **157-176行目**: File Growth評価
- **181-197行目**: File Location評価
- **201-218行目**: File MaxSize評価
- **222-240行目**: Data File Size Equal評価

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

```
Test-DbaTempDbConfig
    │
    ├─ Connect-DbaInstance
    │      └─ SQL Server SMOオブジェクト取得
    │
    ├─ $server.Databases['tempdb'].Query
    │      └─ DBCC TRACEON/TRACESTATUS
    │
    └─ Get-DbaDbFile
           └─ tempdbファイル情報取得
```

### データフロー図

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

SqlInstance     ───▶ Connect-DbaInstance
                            │
                            ├──▶ DBCC TRACESTATUS ───▶ TF 1118評価
                            │
                            ├──▶ Get-DbaDbFile    ───▶ File Count評価
                            │          │
                            │          ├─────────────▶ File Growth評価
                            │          │
                            │          ├─────────────▶ File Location評価
                            │          │
                            │          ├─────────────▶ File MaxSize評価
                            │          │
                            │          └─────────────▶ Size Equal評価
                            │
                            └──▶ 6個のPSCustomObject出力
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Test-DbaTempDbConfig.ps1 | `public/Test-DbaTempDbConfig.ps1` | ソース | メイン関数定義 |
| Get-DbaDbFile.ps1 | `public/Get-DbaDbFile.ps1` | ソース | データベースファイル情報取得 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続処理 |
| Stop-Function.ps1 | `internal/functions/flowcontrol/Stop-Function.ps1` | ソース | エラーハンドリング関数 |
