# 画面設計書 101-デフォルトパス

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおけるSQL Serverのデフォルトパス管理機能（Get-DbaDefaultPath、Set-DbaDefaultPath）の設計仕様を記載する。

### 本画面の処理概要

SQL Serverインスタンスのデフォルトファイルパス（データファイル、ログファイル、バックアップ、エラーログ）を取得・設定するためのコマンドラインインターフェースを提供する。

**業務上の目的・背景**：SQL Serverは新規データベース作成時やバックアップ実行時に、明示的なパス指定がない場合にデフォルトパスを使用する。この設定を一元管理することで、ファイル配置の標準化、ストレージ容量計画、環境構成の監査が可能となる。複数インスタンスのパス設定を比較し、環境間の整合性を確認する際にも活用される。

**画面へのアクセス方法**：PowerShellコンソールから `Get-DbaDefaultPath` または `Set-DbaDefaultPath` コマンドを実行する。パイプライン入力に対応しており、`Connect-DbaInstance` の結果をパイプで渡すことも可能。

**主要な操作・処理内容**：
1. デフォルトパスの取得（Get-DbaDefaultPath）：インスタンスのデータ、ログ、バックアップ、エラーログの各デフォルトパスを取得
2. デフォルトパスの設定（Set-DbaDefaultPath）：Data、Log、Backupの各デフォルトパスを指定値に変更
3. パス存在検証：Set-DbaDefaultPath実行時に、指定パスがSQL Serverサービスアカウントからアクセス可能か検証
4. サービス再起動通知：Data/Logパス変更時は、変更を有効にするためにサービス再起動が必要である旨を警告

**画面遷移**：本コマンドは独立して実行可能。Get-DbaDefaultPathの出力をSet-DbaDefaultPathにパイプで渡すことで、複数インスタンスの設定変更を効率的に実行できる。

**権限による表示制御**：SQL Serverへの接続権限が必要。Set-DbaDefaultPathによる設定変更にはサーバーレベルの管理者権限が必要。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 115 | Get-DbaDefaultPath | 主機能 | デフォルトパスの取得 |
| 223 | Set-DbaDefaultPath | 主機能 | デフォルトパスの設定 |

## 画面種別

コマンドラインインターフェース（取得・設定）

## URL/ルーティング

PowerShellコマンド実行

## 入出力項目

### Get-DbaDefaultPath パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | 必須 | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | 任意 | 代替認証情報 |
| EnableException | Switch | 任意 | 例外を有効にする |

### Set-DbaDefaultPath パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | 必須 | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | 任意 | 代替認証情報 |
| Type | string[] | 任意 | パス種別（Data/Log/Backup） |
| Path | string | 必須 | 設定するパス |
| EnableException | Switch | 任意 | 例外を有効にする |

## 表示項目

### Get-DbaDefaultPath 出力プロパティ

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | SQL Serverホストのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名（ServiceName） |
| SqlInstance | string | 完全なSQL Serverインスタンス名（DomainInstanceName） |
| Data | string | データファイルのデフォルトパス |
| Log | string | ログファイルのデフォルトパス |
| Backup | string | バックアップのデフォルトパス |
| ErrorLog | string | エラーログのパス |

### Set-DbaDefaultPath 出力プロパティ

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | SQL Serverホストのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| Data | string | 設定後のデータファイルパス |
| Log | string | 設定後のログファイルパス |
| Backup | string | 設定後のバックアップパス |

## イベント仕様

### 1-Get-DbaDefaultPath実行

1. Connect-DbaInstanceでSQL Serverに接続
2. $server.DefaultFileプロパティからデータパスを取得
3. パスが空の場合、SERVERPROPERTY('InstanceDefaultDataPath')をクエリ
4. それでも空の場合、modelデータベースのファイルパスから取得
5. 最終フォールバックとしてMasterDbPathを使用
6. 同様の手順でログパスを取得
7. BackupDirectoryとErrorlogPathをSMOから取得
8. PSCustomObjectとして出力

### 2-Set-DbaDefaultPath実行

1. Connect-DbaInstanceでSQL Serverに接続
2. 指定パスの末尾スラッシュを除去して正規化
3. Test-DbaPathでパスのアクセス可能性を検証
4. Type指定に応じて$server.DefaultFile、$server.DefaultLog、$server.BackupDirectoryを設定
5. $server.Alter()で変更をコミット
6. Data/Log変更時はサービス再起動が必要な旨を警告出力
7. 変更後の設定をPSCustomObjectとして出力

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| Get-DbaDefaultPath | - | SELECT | SMOプロパティとSERVERPROPERTY関数からの取得 |
| Set-DbaDefaultPath | SQL Server構成 | UPDATE | SMO経由でサーバー設定を変更 |

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

#### SQL Server構成（SMO Server オブジェクト）

| 操作 | 項目（プロパティ名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| UPDATE | DefaultFile | Typeに"Data"が含まれる場合に設定 | データファイルのデフォルトパス |
| UPDATE | DefaultLog | Typeに"Log"が含まれる場合に設定 | ログファイルのデフォルトパス |
| UPDATE | BackupDirectory | Typeに"Backup"が含まれる場合に設定 | バックアップのデフォルトパス |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 発生条件 |
|-------------|------|--------------|----------|
| MSG001 | 警告 | "You must restart the SQL Service on $instance for changes to take effect" | Data/Logパス変更後 |
| MSG002 | エラー | "Path $Path is not accessible on $($server.Name)" | パスにアクセスできない場合 |
| MSG003 | エラー | "Error occurred while committing changes to $instance" | Alter()失敗時 |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| 接続失敗 | Stop-Functionでエラー出力し、Continueで次のインスタンスへ |
| パス検証失敗 | Stop-Functionでエラー出力し、Continueで次のインスタンスへ |
| Alter()失敗 | Stop-Functionでエラー出力し、Continueで次のインスタンスへ |

## 備考

- エラーログのパス変更にはSet-DbaStartupParameterを使用する必要がある
- Azure SQLはサポートされていない（-AzureUnsupportedオプション）
- パイプライン入力により複数インスタンスの一括処理が可能

---

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

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

### 推奨読解順序

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

SMO Serverオブジェクトのプロパティがデフォルトパス管理の中心となる。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaDefaultPath.ps1 | `public/Get-DbaDefaultPath.ps1` | 出力オブジェクトの構造（行109-117）を確認 |

**読解のコツ**: PSCustomObjectの構造を理解することで、出力データの形式を把握できる

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

Get-DbaDefaultPathが取得処理、Set-DbaDefaultPathが設定処理のエントリーポイント。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaDefaultPath.ps1 | `public/Get-DbaDefaultPath.ps1` | param()ブロック（行64-70）でパラメータ定義を確認 |
| 2-2 | Set-DbaDefaultPath.ps1 | `public/Set-DbaDefaultPath.ps1` | param()ブロック（行81-91）でパラメータ定義を確認 |

**主要処理フロー**:
1. **行72-77**: インスタンスへの接続処理
2. **行79-89**: データパス取得のフォールバックロジック
3. **行92-107**: ログパス取得のフォールバックロジック
4. **行109-118**: 結果オブジェクトの構築と出力

#### Step 3: パス取得ロジックを理解する

Get-DbaDefaultPathの多段フォールバック取得ロジックを追跡する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaDefaultPath.ps1 | `public/Get-DbaDefaultPath.ps1` | DefaultFileプロパティからSERVERPROPERTY、modelDB、MasterDbPathへのフォールバック |

**主要処理フロー**:
- **行79-80**: $server.DefaultFileを最初に試行
- **行81-82**: 空ならSERVERPROPERTY('InstanceDefaultDataPath')をクエリ
- **行84-86**: それでも空ならmodelデータベースのファイルパスから取得
- **行88-90**: 最終手段としてMasterDbPathを使用

#### Step 4: パス設定ロジックを理解する

Set-DbaDefaultPathの設定処理とバリデーションを追跡する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Set-DbaDefaultPath.ps1 | `public/Set-DbaDefaultPath.ps1` | パス検証、設定、Alter()による永続化の流れ |

**主要処理フロー**:
- **行100-104**: パスの正規化とアクセス検証
- **行106-122**: Type別の設定処理（ShouldProcess対応）
- **行124-141**: Alter()によるコミットと警告出力

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

```
Get-DbaDefaultPath
    │
    ├─ Connect-DbaInstance
    │      └─ SQL Server接続確立
    │
    ├─ $server.DefaultFile / DefaultLog
    │      └─ SMOプロパティ取得
    │
    ├─ $server.Query()
    │      └─ SERVERPROPERTY()クエリ（フォールバック）
    │
    └─ Get-DbaDatabase -Database model
           └─ modelDBからパス取得（最終フォールバック）

Set-DbaDefaultPath
    │
    ├─ Connect-DbaInstance
    │      └─ SQL Server接続確立
    │
    ├─ Test-DbaPath
    │      └─ パスアクセス可能性検証
    │
    ├─ $server.DefaultFile/DefaultLog/BackupDirectory = $Path
    │      └─ SMOプロパティ設定
    │
    └─ $server.Alter()
           └─ 変更の永続化
```

### データフロー図

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

SqlInstance ───────▶ Connect-DbaInstance ───────▶ SMO Server Object
                           │
                           ▼
                    DefaultFile取得
                    (フォールバック付き)
                           │
                           ▼
                    DefaultLog取得
                    (フォールバック付き)
                           │
                           ▼
                    BackupDirectory/ErrorlogPath取得
                           │
                           ▼
                    PSCustomObject生成 ───────▶ パス情報オブジェクト
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaDefaultPath.ps1 | `public/Get-DbaDefaultPath.ps1` | ソース | デフォルトパス取得コマンド |
| Set-DbaDefaultPath.ps1 | `public/Set-DbaDefaultPath.ps1` | ソース | デフォルトパス設定コマンド |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続確立 |
| Test-DbaPath.ps1 | `public/Test-DbaPath.ps1` | ソース | パス存在検証 |
| Get-DbaDatabase.ps1 | `public/Get-DbaDatabase.ps1` | ソース | データベース情報取得（フォールバック用） |
