# 画面設計書 103-起動プロシージャ

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおけるSQL Serverの起動プロシージャ管理機能（Get-DbaStartupProcedure、Enable-DbaStartupProcedure、Disable-DbaStartupProcedure、Copy-DbaStartupProcedure）の設計仕様を記載する。

### 本画面の処理概要

SQL Server起動時に自動実行されるストアドプロシージャ（masterデータベース内）を取得・有効化・無効化・コピーするためのコマンドラインインターフェースを提供する。

**業務上の目的・背景**：SQL Serverの起動プロシージャは、サービス開始時に自動実行される処理を定義する機能である。アプリケーション設定の初期化、キャッシュテーブルの事前読み込み、カスタム監視の開始など、サービス再起動ごとに必要な処理を自動化できる。従来はsp_procoptionを使用して手動設定していたが、本機能によりPowerShellから一元管理でき、サーバーマイグレーション時の設定移行も容易になる。

**画面へのアクセス方法**：PowerShellコンソールから各コマンドを実行する。masterデータベースへのアクセス権限が必要。

**主要な操作・処理内容**：
1. 起動プロシージャの取得（Get-DbaStartupProcedure）：masterデータベースで起動フラグが設定されたストアドプロシージャを取得
2. 起動プロシージャの有効化（Enable-DbaStartupProcedure）：指定プロシージャのStartupプロパティをtrueに設定
3. 起動プロシージャの無効化（Disable-DbaStartupProcedure）：指定プロシージャのStartupプロパティをfalseに設定
4. 起動プロシージャのコピー（Copy-DbaStartupProcedure）：インスタンス間で起動プロシージャを移行

**画面遷移**：Get-DbaStartupProcedureの結果をパイプでDisable-DbaStartupProcedureに渡すことで、一括無効化が可能。

**権限による表示制御**：masterデータベースでのストアドプロシージャ作成・変更権限が必要。Copy-DbaStartupProcedureではsysadmin権限が必要。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 662 | Get-DbaStartupProcedure | 主機能 | 起動プロシージャの取得 |
| 659 | Enable-DbaStartupProcedure | 主機能 | 起動プロシージャの有効化 |
| 658 | Disable-DbaStartupProcedure | 主機能 | 起動プロシージャの無効化 |
| 657 | Copy-DbaStartupProcedure | 補助機能 | 起動プロシージャのコピー |

## 画面種別

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

## URL/ルーティング

PowerShellコマンド実行

## 入出力項目

### Get-DbaStartupProcedure パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | 必須 | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | 任意 | SQL認証情報 |
| StartupProcedure | string[] | 任意 | 特定プロシージャのフィルタ |
| EnableException | Switch | 任意 | 例外を有効にする |

### Enable-DbaStartupProcedure パラメータ

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

### Disable-DbaStartupProcedure パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | 任意 | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | 任意 | SQL認証情報 |
| StartupProcedure | string[] | 任意 | 無効化するプロシージャ名 |
| InputObject | object[] | 任意 | Get-DbaStartupProcedureからのパイプ入力 |
| EnableException | Switch | 任意 | 例外を有効にする |

### Copy-DbaStartupProcedure パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| Source | DbaInstanceParameter | 必須 | コピー元インスタンス |
| SourceSqlCredential | PSCredential | 任意 | コピー元SQL認証情報 |
| Destination | DbaInstanceParameter[] | 必須 | コピー先インスタンス |
| DestinationSqlCredential | PSCredential | 任意 | コピー先SQL認証情報 |
| Procedure | string[] | 任意 | コピーするプロシージャ名 |
| ExcludeProcedure | string[] | 任意 | 除外するプロシージャ名 |
| Force | Switch | 任意 | 既存プロシージャを上書き |
| EnableException | Switch | 任意 | 例外を有効にする |

## 表示項目

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

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全なインスタンス名 |
| Database | string | データベース名（常にmaster） |
| Schema | string | スキーマ名 |
| ObjectId | int | オブジェクトID |
| CreateDate | DateTime | 作成日時 |
| DateLastModified | DateTime | 最終更新日時 |
| Name | string | プロシージャ名 |
| ImplementationType | string | 実装タイプ（T-SQL/CLR） |
| Startup | bool | 起動時実行フラグ |

### Enable/Disable-DbaStartupProcedure 出力プロパティ

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全なインスタンス名 |
| Database | string | データベース名 |
| Schema | string | スキーマ名 |
| Name | string | プロシージャ名 |
| Startup | bool | 起動時実行フラグ |
| Action | string | 実行アクション（Enable/Disable） |
| Status | bool | 操作成功フラグ |
| Note | string | 操作結果メッセージ |

### Copy-DbaStartupProcedure 出力プロパティ

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| DateTime | DbaDateTime | 実行日時 |
| SourceServer | string | コピー元サーバー名 |
| DestinationServer | string | コピー先サーバー名 |
| Name | string | プロシージャ名 |
| Type | string | オブジェクトタイプ（Startup Stored Procedure） |
| Status | string | 操作結果（Successful/Skipped/Failed） |
| Notes | string | 補足情報 |

## イベント仕様

### 1-Get-DbaStartupProcedure実行

1. Connect-DbaInstanceでSQL Serverに接続
2. $server.EnumStartupProcedures()で起動プロシージャ列挙
3. StartupProcedureパラメータ指定時は名前でフィルタ
4. masterデータベースから該当StoredProcedureオブジェクトを取得
5. NotePropertyを追加してSMOオブジェクトを出力

### 2-Enable-DbaStartupProcedure実行

1. Connect-DbaInstanceでSQL Serverに接続
2. Get-ObjectNamePartsでプロシージャ名を解析
3. masterデータベースのStoredProcedures.Itemで該当プロシージャ取得
4. Startupプロパティがfalseの場合、trueに設定
5. $sp.Alter()で変更を永続化
6. 操作結果をステータス付きで出力

### 3-Disable-DbaStartupProcedure実行

1. InputObject未指定時はSqlInstanceから処理
2. 指定プロシージャをmasterから取得
3. Startupプロパティがtrueの場合、falseに設定
4. $sp.Alter()で変更を永続化
5. 操作結果をステータス付きで出力

### 4-Copy-DbaStartupProcedure実行

1. Get-DbaModuleでコピー元の起動プロシージャ取得
2. 各プロシージャについてコピー先の存在確認
3. Force指定時は既存プロシージャをDROP
4. TextHeader + TextBodyでCREATE PROCEDURE文を構築
5. Invoke-DbaQueryでコピー先に作成
6. sp_procoptionで起動プロシージャとして設定

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| Get-DbaStartupProcedure | sys.procedures | SELECT | 起動プロシージャの列挙 |
| Enable/Disable-DbaStartupProcedure | sys.procedures | UPDATE | Startupフラグの更新（SMO経由） |
| Copy-DbaStartupProcedure | master.sys.procedures | INSERT/DELETE | プロシージャの作成・削除 |

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

#### masterデータベース ストアドプロシージャ

| 操作 | 項目 | 更新値・取得条件 | 備考 |
|-----|-----|-----------------|------|
| UPDATE | Startup | true/false | SMO StoredProcedure.Startupプロパティ |
| INSERT | - | プロシージャ定義 | Copy時にCREATE PROCEDURE実行 |
| EXEC | sp_procoption | 'STARTUP', 'ON' | Copy後に起動設定 |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 発生条件 |
|-------------|------|--------------|----------|
| MSG001 | 情報 | "Enable succeeded" | 有効化成功時 |
| MSG002 | 情報 | "Disable succeeded" | 無効化成功時 |
| MSG003 | 情報 | "Action Enable already performed" | 既に有効化済み |
| MSG004 | 情報 | "Action Disable already performed" | 既に無効化済み |
| MSG005 | エラー | "Requested procedure $proc does not exist." | プロシージャ不存在時 |
| MSG006 | エラー | "Requested procedure $proc could not be parsed." | 名前解析失敗時 |
| MSG007 | 警告 | "Startup procedure $currentProcFullName exists at destination. Use -Force to drop and migrate." | コピー先に既存 |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| 接続失敗 | Stop-Functionでエラー出力し、Continueで次のインスタンスへ |
| プロシージャ不存在 | Stop-Functionでエラー出力し、Continueで次のプロシージャへ |
| 名前解析失敗 | Stop-Functionでエラー出力し、Continueで次のプロシージャへ |
| Alter()失敗 | $status = $false, $note = "failed"を設定 |
| Copy失敗 | Status = "Failed"を設定しエラー詳細をNotesに記録 |

## 備考

- 起動プロシージャはmasterデータベース内のストアドプロシージャのみ対象
- SQL Server 2005以上が必要（MinimumVersion 9）
- EnumStartupProcedures()はSMOのServer.EnumStartupProcedures()メソッドを使用
- sp_procoptionと同等の機能をSMO経由で提供

---

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

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

### 推奨読解順序

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

SMO StoredProcedureオブジェクトのStartupプロパティが中心。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaStartupProcedure.ps1 | `public/Get-DbaStartupProcedure.ps1` | Select-DefaultViewの出力プロパティ（行133-134）を確認 |

**読解のコツ**: EnumStartupProcedures()の戻り値構造（Name, Schema）を理解する

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaStartupProcedure.ps1 | `public/Get-DbaStartupProcedure.ps1` | param()ブロック（行84-90）でパラメータ定義を確認 |
| 2-2 | Enable-DbaStartupProcedure.ps1 | `public/Enable-DbaStartupProcedure.ps1` | param()ブロック（行88-94）でパラメータ定義を確認 |

**主要処理フロー**:
1. **行101**: $server.EnumStartupProcedures()で列挙
2. **行126**: $db.StoredProcedures.Item()で該当プロシージャ取得
3. **行128-131**: NotePropertyの追加

#### Step 3: 有効化/無効化ロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Enable-DbaStartupProcedure.ps1 | `public/Enable-DbaStartupProcedure.ps1` | Startupプロパティの設定（行122-130） |
| 3-2 | Disable-DbaStartupProcedure.ps1 | `public/Disable-DbaStartupProcedure.ps1` | パイプライン入力の処理（行110-145） |

**主要処理フロー**:
- **行116**: $sp = $db.StoredProcedures.Item()
- **行122-130**: Startupプロパティの設定と$sp.Alter()

#### Step 4: コピーロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Copy-DbaStartupProcedure.ps1 | `public/Copy-DbaStartupProcedure.ps1` | プロシージャ定義の取得と転送（行186-199） |

**主要処理フロー**:
- **行122**: Get-DbaModuleで起動プロシージャ一覧取得
- **行190-193**: TextHeader + TextBodyでSQL構築
- **行196-198**: sp_procoptionで起動設定

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

```
Get-DbaStartupProcedure
    │
    ├─ Connect-DbaInstance
    │
    ├─ $server.EnumStartupProcedures()
    │      └─ 起動プロシージャ列挙
    │
    └─ $db.StoredProcedures.Item()
           └─ StoredProcedureオブジェクト取得

Enable/Disable-DbaStartupProcedure
    │
    ├─ Connect-DbaInstance
    │
    ├─ Get-ObjectNameParts
    │      └─ schema.name形式の解析
    │
    ├─ $db.StoredProcedures.Item()
    │
    └─ $sp.Startup = $true/$false
           └─ $sp.Alter()

Copy-DbaStartupProcedure
    │
    ├─ Connect-DbaInstance (Source/Destination)
    │
    ├─ Get-DbaModule -Type StoredProcedure
    │      └─ ExecIsStartupでフィルタ
    │
    ├─ DROP PROCEDURE (Force時)
    │
    ├─ Invoke-DbaQuery (CREATE PROCEDURE)
    │
    └─ Invoke-DbaQuery (sp_procoption)
```

### データフロー図

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

SqlInstance ───────▶ Connect-DbaInstance ───────▶ SMO Server Object
                           │
                           ▼
                    EnumStartupProcedures()
                           │
                           ▼
                    StoredProcedures.Item()
                           │
                           ▼
                    StoredProcedure Object ───────▶ 起動プロシージャ情報
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaStartupProcedure.ps1 | `public/Get-DbaStartupProcedure.ps1` | ソース | 起動プロシージャ取得コマンド |
| Enable-DbaStartupProcedure.ps1 | `public/Enable-DbaStartupProcedure.ps1` | ソース | 起動プロシージャ有効化コマンド |
| Disable-DbaStartupProcedure.ps1 | `public/Disable-DbaStartupProcedure.ps1` | ソース | 起動プロシージャ無効化コマンド |
| Copy-DbaStartupProcedure.ps1 | `public/Copy-DbaStartupProcedure.ps1` | ソース | 起動プロシージャコピーコマンド |
| Get-ObjectNameParts.ps1 | `internal/functions/Get-ObjectNameParts.ps1` | ソース | オブジェクト名解析 |
| Get-DbaModule.ps1 | `public/Get-DbaModule.ps1` | ソース | モジュール情報取得 |
| Invoke-DbaQuery.ps1 | `public/Invoke-DbaQuery.ps1` | ソース | SQLクエリ実行 |
