# 機能設計書 626-Disable-DbaFilestream

## 概要

本ドキュメントは、dbatools PowerShellモジュールの`Disable-DbaFilestream`コマンドレットに関する機能設計書である。このコマンドレットは、SQL ServerのFILESTREAM機能をサービスレベルとインスタンスレベルの両方で無効化する機能を提供する。

### 本機能の処理概要

**業務上の目的・背景**：FILESTREAM機能が不要になった場合や、セキュリティ強化のため、またはFILESTREAM関連の問題トラブルシューティング時に、この機能を無効化する必要がある。FILESTREAMの無効化にはSQL Serverサービスの再起動が必要であり、この関数はその両方のレベルで設定を変更し、オプションで自動再起動も実行できる。

**機能の利用シーン**：
- FILESTREAM機能の廃止
- セキュリティ強化のためのFILESTREAM無効化
- FILESTREAM関連の問題解決
- 環境の標準化（FILESTREAM不要な環境）

**主要な処理内容**：
1. 対象SQL Serverインスタンスへの接続確立
2. インスタンスレベルのFILESTREAM設定取得
3. Set-DbaSpConfigureでFilestreamAccessLevel=0に設定
4. Windowsサービスレベルの設定変更（Set-FileSystemSetting）
5. クラスター環境の場合は各ノードに対して設定
6. Forceスイッチ指定時はSQL Serverサービスを再起動
7. 変更後のFILESTREAM状態を出力

**関連システム・外部連携**：
- SQL Server Management Objects (SMO)
- WMI（Windows Management Instrumentation）
- SQL Serverサービス管理

**権限による制御**：sysadmin権限およびWindowsサーバー管理者権限が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | CLIコマンド | 主画面 | PowerShellコンソールからの実行 |

## 機能種別

設定変更 / サービス管理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstance[] | Yes | 対象SQL Serverインスタンス | ValueFromPipelineByPropertyName |
| SqlCredential | PSCredential | No | SQL Server接続用資格情報 | ValueFromPipelineByPropertyName |
| Credential | PSCredential | No | Windows接続用資格情報 | ValueFromPipelineByPropertyName |
| Force | switch | No | 確認プロンプトをバイパスしサービスを自動再起動 | - |
| EnableException | switch | No | 例外処理モード切替 | - |

### 入力データソース

- PowerShellコマンドラインからのパラメータ入力
- パイプラインからのGet-DbaFilestream出力

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全インスタンス名 |
| InstanceAccess | string | インスタンスレベルのアクセス状態（Disabled） |
| ServiceAccess | string | サービスレベルのアクセス状態（Disabled） |
| ServiceShareName | string | FILESTREAMの共有名（存在する場合） |

### 出力先

PowerShellパイプライン（PSCustomObject via Get-DbaFilestream）

## 処理フロー

### 処理シーケンス

```
1. begin ブロック
   └─ 1.1 FileStreamLevel = 0（Disabled）に設定
   └─ 1.2 出力ルックアップテーブル定義
   └─ 1.3 ForceスイッチでConfirmPreference='none'に設定
2. process ブロック（各インスタンスごと）
   └─ 2.1 Connect-DbaInstanceで接続
   └─ 2.2 現在のFilestreamAccessLevel取得
   └─ 2.3 ShouldProcess確認
   └─ 2.4 Set-DbaSpConfigureでFilestreamAccessLevel=0
   └─ 2.5 クラスター判定
   └─ 2.6 各ノードまたは単一サーバーにSet-FileSystemSetting実行
   └─ 2.7 Forceの場合はRestart-DbaService実行
   └─ 2.8 Get-DbaFilestreamで最新状態を出力
   └─ 2.9 再起動が必要な場合は警告メッセージ
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[FileStreamLevel=0設定]
    B --> C[foreach instance]
    C --> D[Connect-DbaInstance]
    D --> E{接続成功?}
    E -->|No| F[Stop-Function]
    F --> C
    E -->|Yes| G[現在の設定取得]
    G --> H{ShouldProcess確認}
    H -->|No| C
    H -->|Yes| I[Set-DbaSpConfigure Level=0]
    I --> J{クラスター?}
    J -->|Yes| K[各ノードにSet-FileSystemSetting]
    J -->|No| L[単一サーバーにSet-FileSystemSetting]
    K --> M{Force?}
    L --> M
    M -->|Yes| N[Restart-DbaService]
    M -->|No| O[警告: 再起動必要]
    N --> P[Get-DbaFilestream出力]
    O --> P
    P --> C
    C --> Q[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | 高影響確認 | ConfirmImpact='High'のためデフォルトで確認プロンプト | 常時 |
| BR-002 | サービス再起動 | FILESTREAMの変更にはSQL Serverサービスの再起動が必要 | 常時 |
| BR-003 | Force自動再起動 | Forceスイッチで確認なしに自動再起動 | Force指定時 |
| BR-004 | クラスター対応 | クラスター環境では全ノードに設定を適用 | クラスター環境 |
| BR-005 | 2層設定 | インスタンスレベルとサービスレベルの両方を設定 | 常時 |

### 計算ロジック

- FileStreamLevel: 0=Disabled, 1=T-SQL only, 2=T-SQL and I/O streaming, 3=Full access
- 無効化時は常に0を設定

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| sp_configure | sys.configurations | UPDATE | FilestreamAccessLevel設定変更 |

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

#### sys.configurations

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| UPDATE | value | 0 | FilestreamAccessLevel |
| UPDATE | value_in_use | 0 | サービス再起動後に反映 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | Stop-Function | 接続失敗 | 接続情報を確認 |
| - | Stop-Function | Set-DbaSpConfigure失敗 | 権限を確認 |
| - | Warning | 再起動未実行 | 手動でサービス再起動 |

### リトライ仕様

リトライ機能なし

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

sp_configureは即時反映。ただし、value_in_useへの反映にはサービス再起動が必要。

## パフォーマンス要件

特に定義なし。ただし、サービス再起動時は一時的なサービス停止が発生。

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

- sysadmin権限が必要
- Windows管理者権限が必要（サービス再起動時）
- ConfirmImpact='High'による誤操作防止
- 本番環境での実行は計画的に

## 備考

- サービス再起動なしでは設定は完全に有効にならない
- クラスター環境ではGet-DbaWsfcNodeで全ノードを取得
- パイプラインからGet-DbaFilestream出力を受け取り可能

---

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

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

### 推奨読解順序

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

出力オブジェクトの構造（Get-DbaFilestream経由）を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaFilestream.ps1 | `public/Get-DbaFilestream.ps1` | 出力PSCustomObjectの構造 |

**読解のコツ**: 出力はGet-DbaFilestreamからの戻り値。InstanceAccess, ServiceAccess, ServiceShareNameなどのプロパティを持つ。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Disable-DbaFilestream.ps1 | `public/Disable-DbaFilestream.ps1` | パラメータ定義とbeginブロック |

**主要処理フロー**:
1. **87-97行目**: パラメータ定義（Mandatory, ValueFromPipelineByPropertyName）
2. **98-109行目**: beginブロック - レベル=0設定、ルックアップテーブル
3. **110-151行目**: processブロック - メイン処理

#### Step 3: 各処理層を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Disable-DbaFilestream.ps1 | `public/Disable-DbaFilestream.ps1` | 無効化ロジック |

**主要処理フロー**:
- **112-116行目**: Connect-DbaInstanceで接続
- **119行目**: 現在のFilestreamAccessLevel取得
- **121-126行目**: ShouldProcess確認とSet-DbaSpConfigure
- **130-137行目**: クラスター/単一サーバー分岐とSet-FileSystemSetting
- **139-142行目**: Force時のRestart-DbaService
- **144行目**: Get-DbaFilestreamで最新状態出力

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

```
Disable-DbaFilestream
    │
    ├─ Connect-DbaInstance (SQL接続)
    │
    ├─ Set-DbaSpConfigure (インスタンスレベル設定)
    │      └─ FilestreamAccessLevel = 0
    │
    ├─ Get-DbaWsfcNode (クラスターノード取得)
    │      └─ クラスター環境のみ
    │
    ├─ Set-FileSystemSetting (サービスレベル設定)
    │      └─ 各ノードまたは単一サーバー
    │
    ├─ Restart-DbaService (サービス再起動)
    │      └─ Force時のみ
    │
    └─ Get-DbaFilestream (状態取得・出力)
```

### データフロー図

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

SqlInstance ────────────────▶ Connect-DbaInstance
                                   │
                                   ▼
                            Set-DbaSpConfigure
                            (FilestreamAccessLevel=0)
                                   │
                                   ▼
Credential ─────────────────▶ Set-FileSystemSetting
                            (サービスレベル=0)
                                   │
                                   ▼
                            Restart-DbaService (Force時)
                                   │
                                   ▼
                            Get-DbaFilestream ───────────▶ PSCustomObject
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Disable-DbaFilestream.ps1 | `public/Disable-DbaFilestream.ps1` | ソース | メインコマンドレット |
| Get-DbaFilestream.ps1 | `public/Get-DbaFilestream.ps1` | ソース | FILESTREAM状態取得 |
| Enable-DbaFilestream.ps1 | `public/Enable-DbaFilestream.ps1` | ソース | FILESTREAM有効化（対機能） |
| Set-DbaSpConfigure.ps1 | `public/Set-DbaSpConfigure.ps1` | ソース | sp_configure設定変更 |
| Restart-DbaService.ps1 | `public/Restart-DbaService.ps1` | ソース | サービス再起動 |
| Get-DbaWsfcNode.ps1 | `public/Get-DbaWsfcNode.ps1` | ソース | クラスターノード取得 |
