# 機能設計書 658-Disable-DbaStartupProcedure

## 概要

本ドキュメントは、dbatools PowerShellモジュールの `Disable-DbaStartupProcedure` 関数の機能設計を記述するものである。本機能はSQL Serverサービス起動時に自動実行されるストアドプロシージャのスタートアップ設定を無効化するコマンドレットである。

### 本機能の処理概要

**業務上の目的・背景**：
SQL Serverサービス起動時に自動実行されるスタートアッププロシージャが問題を引き起こす場合や、一時的に実行を停止したい場合がある。本機能は、masterデータベースのスタートアッププロシージャの自動実行設定を無効化することで、起動時の問題解決やメンテナンス作業を支援する。sp_procoption @OptionValue = off と同等の操作をオブジェクトベースで提供し、詳細なステータス報告を行う。

**機能の利用シーン**：
- SQL Server起動時の問題トラブルシューティング
- スタートアッププロシージャの一時無効化
- サーバーメンテナンス時の自動実行停止
- 問題のあるスタートアッププロシージャの特定と無効化

**主要な処理内容**：
1. SQL Serverインスタンスへの接続
2. 対象プロシージャの特定（パラメータまたはパイプライン入力）
3. SMO StoredProcedure オブジェクトの Startup プロパティを false に設定
4. Alter() メソッドによる変更の適用
5. 結果オブジェクトの出力

**関連システム・外部連携**：
- SQL Server SMO (StoredProcedure オブジェクト)
- Get-DbaStartupProcedure コマンドレットからのパイプライン入力
- Get-ObjectNameParts ヘルパー関数によるプロシージャ名解析

**権限による制御**：
- masterデータベースへの変更権限が必要
- プロシージャのスタートアップ設定変更には sysadmin 権限が推奨

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | CLI (PowerShell) | 主画面 | コマンドライン実行によるスタートアップ無効化 |

## 機能種別

設定変更処理（UPDATE）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | No | 対象SQL Serverインスタンス | SqlInstanceまたはInputObjectのいずれか必須 |
| SqlCredential | PSCredential | No | SQL Server接続用資格情報 | - |
| StartupProcedure | string[] | No | 対象プロシージャ名（スキーマ修飾可） | SqlInstance指定時は必須 |
| InputObject | object[] | No | パイプラインからのプロシージャオブジェクト | ValueFromPipeline |
| EnableException | switch | No | 例外処理の有効化 | - |

### 入力データソース

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

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全修飾インスタンス名 |
| Database | string | データベース名（常に'master'） |
| Schema | string | プロシージャのスキーマ名 |
| Name | string | プロシージャ名 |
| Startup | bool | スタートアップ状態（成功時は常にfalse） |
| Action | string | 実行アクション（常に'Disable'） |
| Status | bool | 操作成否（true=成功、false=スキップ/失敗） |
| Note | string | 結果メッセージ |

### 出力先

PowerShellパイプライン（SMO StoredProcedure オブジェクトに拡張プロパティを追加）

## 処理フロー

### 処理シーケンス

```
1. 初期化処理（beginブロック）
   └─ $action = 'Disable', $startup = $false 設定

2. メイン処理（processブロック）
   └─ パラメータ検証
       └─ InputObject未指定時はSqlInstance + StartupProcedure必須
   └─ SqlInstance指定時
       └─ SQL Serverへの接続
       └─ masterデータベースからプロシージャ取得
       └─ InputObjectに追加
   └─ 各プロシージャの処理
       └─ 現在のStartup状態チェック
       └─ 既にfalseなら"already performed"
       └─ ShouldProcess確認
       └─ Startup = false, Alter()実行
       └─ 結果出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{InputObject指定?}
    B -->|No| C{SqlInstance指定?}
    C -->|No| D[エラー: パラメータ不足]
    C -->|Yes| E{StartupProcedure指定?}
    E -->|No| F[エラー: プロシージャ名必須]
    E -->|Yes| G[SQL Server接続]
    G --> H[masterからプロシージャ取得]
    H --> I[InputObjectに追加]
    B -->|Yes| J[各プロシージャをループ]
    I --> J
    J --> K{Startup既にfalse?}
    K -->|Yes| L[Status=false, Note="already performed"]
    K -->|No| M{ShouldProcess?}
    M -->|No| N[Status=false, Note="skipped"]
    M -->|Yes| O[Startup=false, Alter実行]
    O --> P{成功?}
    P -->|Yes| Q[Status=true, Note="succeded"]
    P -->|No| R[Status=false, Note="failed"]
    L --> S[拡張プロパティ追加]
    N --> S
    Q --> S
    R --> S
    S --> T[Select-DefaultView出力]
    T --> U{次のプロシージャ?}
    U -->|Yes| J
    U -->|No| V[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | 既存状態チェック | 既にStartup=falseなら操作不要 | 処理前チェック時 |
| BR-002 | masterデータベース限定 | スタートアッププロシージャはmasterデータベースのみ | 常時 |
| BR-003 | スキーマ修飾名対応 | '[dbo].[ProcName]'形式を解析 | プロシージャ名解析時 |
| BR-004 | 高影響確認 | ConfirmImpact = 'High' | ShouldProcess時 |

### 計算ロジック

特になし（単純なブール値の設定）

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| プロシージャ取得 | master.sys.procedures | SELECT | StoredProcedures.Item() |
| スタートアップ設定変更 | - | UPDATE（間接） | SMO Alter() |

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

#### sys.procedures（間接）

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| UPDATE | is_auto_executed | 0（false） | SMO Startup プロパティ経由 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | パラメータエラー | SqlInstance/InputObject両方未指定 | Stop-Function |
| - | パラメータエラー | SqlInstance指定時にStartupProcedure未指定 | Stop-Function |
| - | 接続エラー | SQL Serverへの接続失敗 | Stop-Function with -Continue |
| - | 解析エラー | プロシージャ名の解析失敗 | Stop-Function with -Continue |
| - | 存在エラー | プロシージャが存在しない | Stop-Function with -Continue |
| - | 実行エラー | Alter()失敗 | Status=false, Note="failed" |

### リトライ仕様

自動リトライは実装されていない。

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

- SMO Alter() によるメタデータ変更
- 個別操作ごとに即座にコミット

## パフォーマンス要件

- 単一プロシージャの操作は即座に完了
- 複数プロシージャをパイプライン処理可能

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

- sysadmin権限が推奨
- ShouldProcess によるConfirm/WhatIf対応
- ConfirmImpact='High' で確認プロンプト表示

## 備考

- Enable-DbaStartupProcedure と対になる機能
- SMO Startup プロパティを使用（sp_procoption のラッパー）
- 出力はSMO StoredProcedure オブジェクトにNotePropertyを追加

---

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

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

### 推奨読解順序

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

入出力で使用されるデータ構造を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Disable-DbaStartupProcedure.ps1 | `public/Disable-DbaStartupProcedure.ps1` | 174-183行目: Add-Member によるプロパティ追加 |

**読解のコツ**: SMO StoredProcedure オブジェクトにNotePropertyを追加して出力形式を拡張している。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Disable-DbaStartupProcedure.ps1 | `public/Disable-DbaStartupProcedure.ps1` | 95-103行目: パラメータ定義 |
| 2-2 | Disable-DbaStartupProcedure.ps1 | `public/Disable-DbaStartupProcedure.ps1` | 104-107行目: beginブロック |

**主要処理フロー**:
1. **105行目**: $action = 'Disable'
2. **106行目**: $startup = $false

#### Step 3: パラメータ処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Disable-DbaStartupProcedure.ps1 | `public/Disable-DbaStartupProcedure.ps1` | 109-145行目: パラメータ検証とプロシージャ取得 |

**主要処理フロー**:
- **110-119行目**: InputObject未指定時のパラメータ検証
- **131-132行目**: Get-ObjectNameParts でプロシージャ名解析
- **133行目**: StoredProcedures.Item でSMOオブジェクト取得

#### Step 4: スタートアップ無効化処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Disable-DbaStartupProcedure.ps1 | `public/Disable-DbaStartupProcedure.ps1` | 147-172行目: 無効化処理 |

**主要処理フロー**:
- **152-155行目**: 既にfalseなら"already performed"
- **157-165行目**: ShouldProcess確認とAlter()実行
- **158-159行目**: `$sp.Startup = $startup`, `$sp.Alter()`

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

```
Disable-DbaStartupProcedure
    │
    ├─ begin ブロック
    │      └─ $action, $startup 初期化
    │
    └─ process ブロック
           │
           ├─ パラメータ検証
           │      └─ Test-Bound
           │
           ├─ SqlInstance指定時
           │      ├─ Connect-DbaInstance
           │      ├─ Get-ObjectNameParts
           │      └─ StoredProcedures.Item
           │
           └─ 各プロシージャをループ
                  │
                  ├─ Startup状態チェック
                  │
                  ├─ ShouldProcess
                  │      └─ $sp.Startup = $false
                  │      └─ $sp.Alter()
                  │
                  ├─ Add-Member（プロパティ追加）
                  │
                  └─ Select-DefaultView
```

### データフロー図

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

SqlInstance ────┐
                ├──▶ Connect-DbaInstance
SqlCredential ──┤            │
                │            ▼
StartupProc ────┤    Get-ObjectNameParts
                │            │
                │            ▼
                │    StoredProcedures.Item
                │            │
InputObject ────┘            │
                             ▼
                     ┌───────┴───────┐
                     │ Startup状態   │
                     └───────┬───────┘
                     true │       │false
                          ▼       │
                     ShouldProcess │
                          │       │
                          ▼       ▼
                     Startup=false "already performed"
                     Alter()
                          │
                          ▼
                     Add-Member
                     (ComputerName, InstanceName,
                      SqlInstance, Database,
                      Action, Status, Note)
                          │
                          ▼
                     ─────────────────────────▶ StoredProcedure
                                                (拡張プロパティ付き)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Disable-DbaStartupProcedure.ps1 | `public/Disable-DbaStartupProcedure.ps1` | ソース | メイン機能実装 |
| Enable-DbaStartupProcedure.ps1 | `public/Enable-DbaStartupProcedure.ps1` | ソース | 対になる有効化機能 |
| Get-DbaStartupProcedure.ps1 | `public/Get-DbaStartupProcedure.ps1` | ソース | パイプライン入力元 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続処理 |
