# 機能設計書 508-Remove-DbaAgentJobStep

## 概要

本ドキュメントは、SQL Server Agent ジョブステップを削除する `Remove-DbaAgentJobStep` コマンドの機能設計書である。

### 本機能の処理概要

**業務上の目的・背景**：SQL Server Agent ジョブは複数のステップで構成され、各ステップは特定の処理を実行する。本コマンドは、ジョブから不要になった個別のステップを削除する機能を提供する。これにより、ジョブ全体を削除せずに、特定のステップのみを削除してジョブのワークフローを修正できる。例えば、廃止されたバックアップ検証ステップ、古い通知ステップ、または失敗したコンポーネントの削除などに使用される。

**機能の利用シーン**：obsolete なバックアップステップの削除、廃止された通知ステップの除去、失敗したジョブコンポーネントのクリーンアップ、ジョブワークフローの簡素化などに利用される。

**主要な処理内容**：
1. 対象インスタンスへの接続（Connect-DbaInstance 使用）
2. 指定されたジョブの存在確認
3. 指定されたジョブステップの存在確認
4. ShouldProcess による削除確認
5. SMO（JobStep.Drop() メソッド）を使用したステップ削除
6. 処理完了メッセージの出力

**関連システム・外部連携**：SQL Server Agent サービス、msdb データベース

**権限による制御**：対象インスタンスで sysadmin 権限または SQLAgentOperatorRole が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 9 | ジョブステップ管理 | 主画面 | SQLエージェントジョブステップの削除 |

## 機能種別

CRUD操作（Delete）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | Yes | 対象SQL Serverインスタンス | 接続可能なインスタンス名 |
| SqlCredential | PSCredential | No | 代替認証情報 | - |
| Job | object[] | Yes | ステップを削除するジョブ名 | 存在するジョブ名、ValidateNotNullOrEmpty |
| StepName | string | Yes | 削除するステップ名 | 存在するステップ名、ValidateNotNullOrEmpty |
| EnableException | switch | No | 例外を有効化 | - |

### 入力データソース

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

## 出力仕様

### 出力データ

None - 本コマンドは削除操作の結果をオブジェクトとして返却しない。

### 出力先

処理完了メッセージのみ（Write-Message 経由）

## 処理フロー

### 処理シーケンス

```
1. processブロック
   └─ 各 SqlInstance に対するループ
       ├─ インスタンス接続
       └─ 各 Job に対するループ
           ├─ ジョブ存在確認
           │   └─ 存在しない場合: エラー出力、次へ
           ├─ ステップ存在確認
           │   └─ 存在しない場合: エラー出力、次へ
           └─ ShouldProcess による確認
               └─ 確認OK: JobStep.Drop() 実行
2. endブロック
   └─ 完了メッセージ出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[インスタンス接続]
    B --> C{次のJob存在?}
    C -->|No| D[endブロック]
    C -->|Yes| E{ジョブ存在?}
    E -->|No| F[エラー出力]
    F --> C
    E -->|Yes| G{ステップ存在?}
    G -->|No| H[エラー出力]
    H --> C
    G -->|Yes| I{ShouldProcess確認}
    I -->|No| C
    I -->|Yes| J[JobStep.Drop実行]
    J --> K{成功?}
    K -->|Yes| C
    K -->|No| L[エラー出力]
    L --> C
    D --> M[完了メッセージ]
    M --> N[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-508-01 | ジョブ存在必須 | 指定されたジョブが存在しない場合はエラー | 常時 |
| BR-508-02 | ステップ存在必須 | 指定されたステップが存在しない場合はエラー | 常時 |
| BR-508-03 | 確認プロンプト | ConfirmImpact が High のため、削除前に確認プロンプトを表示 | 常時 |
| BR-508-04 | 出力なし | 本コマンドはパイプラインに削除結果オブジェクトを出力しない | 常時 |

### 計算ロジック

特になし。

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| ステップ削除 | msdb.dbo.sysjobsteps | DELETE | SMO経由でステップレコード削除 |

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

#### msdb.dbo.sysjobsteps

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| DELETE | job_id, step_id | 指定ジョブ・ステップ | SMO Drop()で実行 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 接続エラー | インスタンスへの接続失敗 | Stop-Function で処理継続 |
| - | ジョブ不存在 | 指定ジョブが存在しない | Stop-Function で処理継続（typo: "doesnn't"） |
| - | ステップ不存在 | 指定ステップが存在しない | Stop-Function で処理継続 |
| - | 削除エラー | JobStep.Drop() 失敗 | Stop-Function で処理継続 |

### リトライ仕様

リトライ処理は実装されていない。

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

SMO の JobStep.Drop() メソッドによる暗黙的トランザクション。

## パフォーマンス要件

特に定義されていない。

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

- 対象インスタンスへの sysadmin 権限または SQLAgentOperatorRole が必要

## 備考

- 複数ジョブからの同名ステップの一括削除をサポート
- 複数インスタンスへの一括削除をサポート
- パイプライン入力（SqlInstance）をサポート
- 削除結果オブジェクトは出力されない（他の Remove-DbaAgent* コマンドと異なる動作）

---

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

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

### 推奨読解順序

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

パラメータの構造と必須設定を理解する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Remove-DbaAgentJobStep.ps1 | `public/Remove-DbaAgentJobStep.ps1` | 75-87行目: パラメータ定義、Job/StepName の必須設定 |

**読解のコツ**: Job と StepName は両方とも Mandatory で ValidateNotNullOrEmpty が設定されている。

#### Step 2: 存在確認処理を理解する

ジョブとステップの存在確認ロジック。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Remove-DbaAgentJobStep.ps1 | `public/Remove-DbaAgentJobStep.ps1` | 98-106行目: 存在確認のネスト構造 |

**主要処理フロー**:
1. **101行目**: ジョブ存在確認（$Server.JobServer.Jobs.Name -notcontains $j）
2. **102行目**: ジョブ不存在時のエラー（typo: "doesnn't"）
3. **105行目**: ステップ存在確認（$Server.JobServer.Jobs[$j].JobSteps.Name -notcontains $StepName）

#### Step 3: 削除処理を理解する

実際の削除実行ロジック。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Remove-DbaAgentJobStep.ps1 | `public/Remove-DbaAgentJobStep.ps1` | 108-120行目: 削除処理 |

**主要処理フロー**:
- **109行目**: ShouldProcess 確認
- **111行目**: JobSteps[$StepName] でステップオブジェクト取得
- **113行目**: Drop() 実行
- **114-116行目**: エラー処理

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

```
Remove-DbaAgentJobStep
    │
    ├─ Connect-DbaInstance (93行目)
    │      └─ SQL Server インスタンスへの接続確立
    │
    └─ $Server.JobServer.Jobs[$j].JobSteps[$StepName].Drop() (113行目)
           └─ SMO経由でジョブステップ削除
```

### データフロー図

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

SqlInstance ─────▶ Connect-DbaInstance ─────▶ Server オブジェクト
                              │
Job ─────────────────────────▶├─▶ ジョブ存在確認
                              │       │
StepName ────────────────────▶├─▶ ステップ存在確認
                              │       │
                              ▼       ▼
                      JobStep.Drop() 実行
                              │
                              ▼
                      (出力オブジェクトなし)
                      完了メッセージのみ
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Remove-DbaAgentJobStep.ps1 | `public/Remove-DbaAgentJobStep.ps1` | ソース | メインコマンド実装 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | インスタンス接続 |
