# 画面設計書 64-データベースファイル成長

## 概要

本ドキュメントは、dbatools PowerShell モジュールにおけるデータベースファイル自動拡張設定の取得・変更機能の設計仕様を定義する。データファイルおよびログファイルの成長設定を確認し、パーセント成長から固定サイズ成長への変更を行う。

### 本画面の処理概要

本機能は、SQL Server データベースのデータファイルおよびログファイルの自動拡張（Auto-Growth）設定を取得・変更する。成長タイプ（パーセント/固定サイズ）、成長増分値、最大サイズ制限などを確認し、パフォーマンス問題を引き起こす可能性のある設定（大きなファイルでのパーセント成長、無制限成長設定、不十分な成長増分など）を特定する。

**業務上の目的・背景**：DBA は大規模データベースでのパーセント成長がパフォーマンス問題を引き起こすことを認識しており、固定サイズ成長への移行が推奨される。本機能により、成長設定を一括確認・変更でき、ストレージ管理の効率化と予測可能なファイル拡張が実現できる。デフォルト64MBの固定成長は、ファイル拡張イベント時のオーバーヘッドと頻度のバランスを取る標準的な設定である。

**画面へのアクセス方法**：PowerShell コンソールから `Get-DbaDbFileGrowth` または `Set-DbaDbFileGrowth` コマンドを直接呼び出す。パイプラインで Get-DbaDatabase から渡すことも可能。

**主要な操作・処理内容**：
1. `Get-DbaDbFileGrowth` - データベースファイルの成長設定を取得
2. `Set-DbaDbFileGrowth` - ファイル成長設定を固定サイズに変更
3. FileType パラメータでデータファイル/ログファイル/両方を選択
4. GrowthType パラメータで KB/MB/GB/TB 単位を指定

**画面遷移**：
- Get-DbaDatabase → Get-DbaDbFileGrowth のパイプライン連携
- Get-DbaDatabase → Set-DbaDbFileGrowth のパイプライン連携
- Get-DbaDbFileGrowth → Format-Table で表形式出力

**権限による表示制御**：データベースへのアクセス権限が必要。ALTER DATABASE 権限が変更時に必要。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | Get-DbaDbFileGrowth | 主機能 | ファイル成長設定の取得 |
| - | Set-DbaDbFileGrowth | 主機能 | ファイル成長設定の変更 |
| - | Get-DbaDbFile | 補助機能 | ファイル情報の内部取得 |

## 画面種別

CLI（コマンドラインインターフェース）/ 一覧出力・設定変更

## URL/ルーティング

PowerShell コマンドレットとして呼び出し。URL は存在しない。

```powershell
Get-DbaDbFileGrowth -SqlInstance <インスタンス名>
Get-DbaDbFileGrowth -SqlInstance <インスタンス名> -Database <DB名>
Set-DbaDbFileGrowth -SqlInstance <インスタンス名> -Database <DB名> -GrowthType GB -Growth 1
```

## 入出力項目

### Get-DbaDbFileGrowth 入力パラメータ

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

### Set-DbaDbFileGrowth 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|---|------|------|
| SqlInstance | DbaInstanceParameter[] | No | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | 認証情報 |
| Database | string[] | No | 対象データベース |
| GrowthType | string | No | 成長単位（KB/MB/GB/TB）、デフォルト MB |
| Growth | int | No | 成長増分値、デフォルト 64 |
| FileType | string | No | 対象ファイルタイプ（All/Data/Log）、デフォルト All |
| InputObject | Microsoft.SqlServer.Management.Smo.Database[] | No | パイプライン入力用データベースオブジェクト |
| WhatIf | switch | No | 実行せずに動作を表示 |
| Confirm | switch | No | 実行前に確認 |
| EnableException | switch | No | 例外処理を有効化 |

## 表示項目

### Get-DbaDbFileGrowth / Set-DbaDbFileGrowth 出力（デフォルト表示）

| プロパティ名 | 型 | 説明 |
|-------------|---|------|
| ComputerName | string | サーバーコンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全修飾インスタンス名 |
| Database | string | データベース名 |
| MaxSize | dbasize | 最大サイズ（KB/MB/GB表示） |
| GrowthType | string | 成長タイプ（Percent/kb） |
| Growth | int/decimal | 成長増分値 |
| File | string | 論理ファイル名（LogicalName のエイリアス） |
| FileName | string | 物理ファイルパス（PhysicalName のエイリアス） |
| State | string | ファイル状態（ONLINE/OFFLINE等） |

### 追加プロパティ（Select-Object * で表示）

| プロパティ名 | 型 | 説明 |
|-------------|---|------|
| DatabaseID | int | データベースID |
| FileGroupName | string | ファイルグループ名（ログファイルはNULL） |
| ID | int | ファイルID |
| Type | int | ファイルタイプ（0=データ、1=ログ） |
| TypeDescription | string | ファイルタイプ説明（ROWS/LOG） |
| LogicalName | string | 論理ファイル名 |
| PhysicalName | string | 物理ファイルパス |
| NextGrowthEventSize | dbasize | 次回成長時の増加サイズ |
| Size | dbasize | 現在のファイルサイズ |
| UsedSpace | dbasize | 使用済み領域 |
| AvailableSpace | dbasize | 利用可能領域 |
| IsOffline | bool | オフラインフラグ |
| IsReadOnly | bool | 読み取り専用フラグ |
| IsSparse | bool | スパースファイルフラグ（スナップショット用） |
| NumberOfDiskWrites | long | 書き込み操作回数 |
| NumberOfDiskReads | long | 読み取り操作回数 |
| ReadFromDisk | dbasize | ディスク読み取りバイト数 |
| WrittenToDisk | dbasize | ディスク書き込みバイト数 |
| VolumeFreeSpace | dbasize | ボリューム空き容量 |

## イベント仕様

### 1-Get-DbaDbFileGrowth 実行

1. Test-Bound で Database 指定時に SqlInstance が必要かチェック
2. Get-DbaDbFile を呼び出してファイル情報を取得
3. Select-DefaultView でデフォルト表示列を制限して出力

### 2-Set-DbaDbFileGrowth 実行

1. Test-Bound で Database または InputObject の指定をチェック
2. Test-Bound で Database 指定時に SqlInstance が必要かチェック
3. SqlInstance 指定時は Get-DbaDatabase でデータベース取得
4. FileType に基づいて対象ファイルを収集（LogFiles / FileGroups.Files）
5. ShouldProcess で WhatIf/Confirm 処理
6. ALTER DATABASE MODIFY FILE で FILEGROWTH を変更
7. Refresh でキャッシュ更新後、Get-DbaDbFileGrowth で結果出力

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| Get-DbaDbFileGrowth | sys.database_files 等 | SELECT | ファイル情報読み取り |
| Set-DbaDbFileGrowth | DATABASE | ALTER | FILEGROWTH 設定変更 |

### Set-DbaDbFileGrowth SQL 構文

```sql
ALTER DATABASE [dbname] MODIFY FILE ( NAME = N'filename', FILEGROWTH = 64MB )
```

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 発生条件 |
|-------------|------|---------------|------------|
| - | エラー | "You must specify SqlInstance when specifying Database" | Database 指定時に SqlInstance 未指定 |
| - | エラー | "You must specify InputObject or Database" | Database も InputObject も未指定 |
| - | エラー | "Could not modify $db on $($db.Parent.Name)" | ALTER DATABASE 失敗時 |

## 例外処理

| 例外条件 | ハンドリング | ユーザーへのフィードバック |
|---------|-------------|-------------------------|
| パラメータ不足 | Stop-Function -Message | 必要なパラメータ指定のガイダンス |
| ALTER DATABASE 失敗 | Stop-Function -Continue | エラー詳細と対象DB情報 |

## 備考

- Get-DbaDbFileGrowth は内部で Get-DbaDbFile を呼び出すラッパー関数
- デフォルト成長設定は 64MB（業界標準的な推奨値）
- GrowthType が "kb" の場合は固定サイズ、"Percent" の場合はパーセント成長
- Set-DbaDbFileGrowth は SMO ではなく T-SQL（ALTER DATABASE）を使用
- IsAccessible でアクセス可能なデータベースのみを対象

---

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

### 推奨読解順序

#### Step 1: Get-DbaDbFileGrowth の構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaDbFileGrowth.ps1 | `public/Get-DbaDbFileGrowth.ps1` | 行 119-122: Get-DbaDbFile 呼び出しと出力整形 |

**主要処理フロー**:
- **行 114-117**: パラメータ検証（Database 指定時の SqlInstance 必須チェック）
- **行 119**: Get-DbaDbFile への委譲
- **行 121**: Select-DefaultView でエイリアス設定（LogicalName → File、PhysicalName → FileName）

#### Step 2: Set-DbaDbFileGrowth の変更ロジック

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Set-DbaDbFileGrowth.ps1 | `public/Set-DbaDbFileGrowth.ps1` | 行 132-157: ファイル変更ループ |

**主要処理フロー**:
- **行 135-140**: FileType による対象ファイル収集
- **行 146**: ALTER DATABASE MODIFY FILE の SQL 構築
- **行 148-150**: クエリ実行と Refresh
- **行 152**: 変更後の状態を Get-DbaDbFileGrowth で出力

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

```
Get-DbaDbFileGrowth
    |
    +-- Test-Bound (パラメータ検証)
    |
    +-- Get-DbaDbFile (@PSBoundParameters)
    |       |
    |       +-- Connect-DbaInstance
    |       +-- sys.database_files クエリ
    |
    +-- Select-DefaultView (表示列制限)

Set-DbaDbFileGrowth
    |
    +-- Test-Bound (パラメータ検証)
    |
    +-- Get-DbaDatabase (SqlInstance 指定時)
    |       |
    |       +-- Where-Object IsAccessible
    |
    +-- foreach ($db in $InputObject)
            |
            +-- $db.LogFiles / $db.FileGroups.Files 収集
            |
            +-- ShouldProcess (WhatIf/Confirm)
            |
            +-- $db.Query("ALTER DATABASE ... MODIFY FILE ...")
            |
            +-- $db.Refresh() / $db.Parent.Refresh()
            |
            +-- Get-DbaDbFileGrowth (結果出力)
```

### データフロー図

```
[入力: SqlInstance/Database/InputObject]
           |
           v
    +----------------+
    | パラメータ検証  |
    +----------------+
           |
           v
    +----------------+
    | Get-DbaDatabase| (Set の場合)
    +----------------+
           |
           v
    +----------------+
    | Get-DbaDbFile  | (Get の場合)
    +----------------+
           |
           v
    +-------------------+
    | ALTER DATABASE    | (Set の場合)
    | MODIFY FILE       |
    +-------------------+
           |
           v
    +----------------+
    | Select-Default |
    | View で整形    |
    +----------------+
           |
           v
[出力: PSCustomObject with File Growth Info]
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaDbFileGrowth.ps1 | `public/Get-DbaDbFileGrowth.ps1` | ソース | ファイル成長設定取得 |
| Set-DbaDbFileGrowth.ps1 | `public/Set-DbaDbFileGrowth.ps1` | ソース | ファイル成長設定変更 |
| Get-DbaDbFile.ps1 | `public/Get-DbaDbFile.ps1` | ソース | ファイル情報取得（内部使用） |
| Get-DbaDatabase.ps1 | `public/Get-DbaDatabase.ps1` | ソース | データベース取得（内部使用） |
