# 通知設計書 27-CommandExecute必須

## 概要

sp_DatabaseRestoreプロシージャにおいて、Ola Hallengren Maintenance SolutionのCommandExecuteストアドプロシージャがインストールされていない場合に発生するエラーメッセージの設計書。

### 本通知の処理概要

**業務上の目的・背景**：sp_DatabaseRestoreはOla Hallengren氏が開発したSQL Server Maintenance Solutionの一部であり、RESTOREコマンドの実行にCommandExecuteストアドプロシージャを使用する。CommandExecuteが存在しない場合、プロシージャは正常に動作できないため、事前にその存在を確認し、未インストールの場合は明確なエラーメッセージと解決策を提示する。

**通知の送信タイミング**：sp_DatabaseRestoreの実行開始後、バージョンチェックを通過した直後、動的SQLを使用してCurrentDatabaseContext内にCommandExecuteストアドプロシージャが存在するかを確認した時点で発生する。

**通知の受信者**：sp_DatabaseRestoreを実行したデータベース管理者。

**通知内容の概要**：CommandExecuteストアドプロシージャが必要であり、正しいデータベースを使用しているか確認するよう促す。

**期待されるアクション**：ユーザーはOla Hallengren Maintenance Solution（https://ola.hallengren.com）をインストールするか、CommandExecuteがインストールされているデータベースのコンテキストでsp_DatabaseRestoreを実行する。

## 通知種別

SQL Serverエラーメッセージ（RAISERROR）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（即時） |
| 優先度 | 高（重大度15） |
| リトライ | 無し |

### 送信先決定ロジック

プロシージャを実行したセッションに対して直接エラーメッセージとして送信される。

## 通知テンプレート

### エラーメッセージ

| 項目 | 内容 |
|-----|------|
| メッセージ形式 | RAISERROR |
| 重大度 | 15 |
| 状態 | 1 |

### 本文テンプレート

```
DatabaseRestore requires the CommandExecute stored procedure from the OLA Hallengren Maintenance solution, are you using the correct database?
```

### 添付ファイル

なし

## テンプレート変数

| 変数名 | 説明 | データ取得元 | 必須 |
|--------|------|-------------|-----|
| なし | 固定メッセージのため変数なし | - | - |

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| プロシージャ実行 | sp_DatabaseRestore実行時 | NOT EXISTS (SELECT name FROM {DB}.sys.objects WHERE type = 'P' AND name = 'CommandExecute') | CommandExecute未存在 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| CommandExecuteが存在 | 正常にインストールされている場合 |
| @Help = 1 | ヘルプ表示モードの場合 |
| @MajorVersion < 10 | バージョンチェックで先にエラーになる |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[バージョンチェック通過] --> B[BEGIN TRY]
    B --> C[現在のDB名取得]
    C --> D[@CommandExecuteCheck SQL構築]
    D --> E[動的SQL実行]
    E --> F{CommandExecute存在?}
    F -->|Yes| G[処理継続]
    F -->|No| H[RAISERROR発行 in 動的SQL]
    H --> I[RETURN in 動的SQL]
    I --> J[BEGIN CATCH - THROW]
```

## データベース参照・更新仕様

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| {CurrentDB}.sys.objects | CommandExecute存在確認 | 動的SQLで実行 |

### テーブル別参照項目詳細

#### sys.objects

| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| name | プロシージャ名照合 | WHERE type = 'P' AND name = 'CommandExecute' |
| type | オブジェクト種別確認 | 'P' = ストアドプロシージャ |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| なし | - | エラー発生時は処理中断 |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| 依存関係エラー | CommandExecute未存在 | Ola Hallengren Solutionをインストール |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0（リトライなし） |
| リトライ間隔 | - |
| リトライ対象エラー | - |

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 制限なし | プロシージャ実行毎に即時発行 |

### 配信時間帯

制限なし（プロシージャ実行時に即時発行）

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

- エラーメッセージにはデータベース名を含まない
- 動的SQL内でRAISERRORが発行されるため、BEGIN TRY/CATCHでエラーをキャッチしてTHROWする

## 備考

- 動的SQLを使用する理由は、現在のデータベースコンテキストを動的に組み込むため
- インストール時には警告メッセージも表示される（行1-7）
- 重大度は15（バージョンチェックエラーと同じ）

---

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

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

### 推奨読解順序

#### Step 1: インストール時の警告を確認

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | 冒頭の警告メッセージ |

**主要処理フロー**:
1. **行1-7**: CommandExecute未インストール時の警告PRINT文

#### Step 2: 検証ロジックを理解

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | 動的SQLによるCommandExecute存在確認 |

**主要処理フロー**:
- **行241-254**: BEGIN TRY...END TRY/BEGIN CATCH...END CATCH ブロック
- **行242**: @CurrentDatabaseContext取得（DB_NAME()）
- **行245-249**: @CommandExecuteCheck動的SQL構築
- **行250**: EXEC (@CommandExecuteCheck) - 動的SQL実行
- **行247**: 動的SQL内のRAISERROR（NOT EXISTS時）

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

```
sp_DatabaseRestore
    |
    +-- バージョンチェック（行235-239）
    |
    +-- BEGIN TRY（行241）
    |       |
    |       +-- @CurrentDatabaseContext = DB_NAME()
    |       |
    |       +-- @CommandExecuteCheck SQL構築
    |       |       |
    |       |       +-- IF NOT EXISTS (SELECT name FROM {DB}.sys.objects
    |       |       |    WHERE type = 'P' AND name = 'CommandExecute')
    |       |       +-- BEGIN RAISERROR(...) RETURN END
    |       |
    |       +-- EXEC (@CommandExecuteCheck)
    |
    +-- END TRY
    |
    +-- BEGIN CATCH
    |       |
    |       +-- THROW（エラー再送出）
    |
    +-- END CATCH
```

### データフロー図

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

DB_NAME() ───> 動的SQL構築 ───> sys.objects検索
                                     |
                              CommandExecute検索
                                     |
                                     +───> 存在しない → RAISERROR
                                     |
                                     +───> 存在する → 処理継続
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| sp_DatabaseRestore.sql | `sp_DatabaseRestore.sql` | ソース | データベースリストアプロシージャ |
