# 通知設計書 52-互換性レベル警告

## 概要

本ドキュメントは、SQL Serverのデータベース互換性レベルが90未満（SQL Server 2000以前）のデータベースが検出された場合に発生する警告通知について定義する。

### 本通知の処理概要

sp_Blitzなどの診断ツールは、SQL Server 2005以降の機能（特にCTE：Common Table Expressions）を使用してデータベースレベルのチェックを実行する。互換性レベル90未満のデータベースが存在する場合、これらのチェックが失敗する可能性があるため、自動的に@CheckUserDatabaseObjectsパラメータを無効化し、ユーザーに通知を行う。

**業務上の目的・背景**：SQL Server 2000互換モード（compatibility_level < 90）で動作するデータベースは、CTEなどの新しいSQL構文をサポートしない。sp_Blitzのデータベースレベルチェックはこれらの構文を使用するため、古い互換性レベルのデータベースが存在すると実行時エラーが発生する。この問題を回避するため、事前にチェックを無効化し、ユーザーに状況を通知することで、予期しないエラーを防止する。

**通知の送信タイミング**：sp_Blitz実行時に、@CheckUserDatabaseObjects = 1（デフォルト）で実行され、かつsys.databasesに互換性レベル90未満のデータベースが1つ以上存在する場合。

**通知の受信者**：sp_Blitzを実行したSQL Serverユーザー（DBA、運用担当者など）。

**通知内容の概要**：互換性レベル90未満のデータベースが検出されたため@CheckUserDatabaseObjectsが自動的に無効化されたこと、および問題のデータベースを特定するためのSQLクエリを案内する。

**期待されるアクション**：ユーザーは提示されたSQLクエリを実行して問題のデータベースを特定し、可能であれば互換性レベルを90以上に更新するか、該当データベースを@SkipChecksで除外してsp_Blitzを再実行する。

## 通知種別

コンソール出力（PRINT文）および結果セット（#BlitzResults）

## 送信仕様

### 基本情報

| 項目 | 内容 |
|-----|------|
| 送信方式 | 同期（PRINT文による即時出力 + 結果セットへの挿入） |
| 優先度 | 中（情報レベル、CheckID 204） |
| リトライ | なし |

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

sp_Blitzを実行したセッションのコンソールおよび結果セットに出力される。

## 通知テンプレート

### コンソール出力

| 項目 | 内容 |
|-----|------|
| 出力方法 | PRINT文（4行） |
| メッセージタイプ | 情報メッセージ |

### 本文テンプレート（PRINT出力）

```
Databases with compatibility level < 90 found, so setting @CheckUserDatabaseObjects = 0.
The database-level checks rely on CTEs, which are not supported in SQL 2000 compat level databases.
Get with the cool kids and switch to a current compatibility level, Grandpa. To find the problems, run:
SELECT * FROM sys.databases WHERE compatibility_level < 90;
```

### 結果セット出力（#BlitzResults）

| 項目 | 値 |
|-----|------|
| CheckID | 204 |
| Priority | 0 |
| FindingsGroup | Informational |
| Finding | @CheckUserDatabaseObjects Disabled |
| URL | https://www.BrentOzar.com/blitz/ |
| Details | Since you have databases with compatibility_level < 90, we can't run @CheckUserDatabaseObjects = 1. To find them: SELECT * FROM sys.databases WHERE compatibility_level < 90 |

### 添付ファイル

なし

## テンプレート変数

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

## 送信トリガー・条件

### トリガー一覧

| トリガー種別 | トリガーイベント | 送信条件 | 説明 |
|------------|----------------|---------|------|
| ストアドプロシージャ実行 | sp_Blitz実行 | @CheckUserDatabaseObjects = 1 AND EXISTS(SELECT * FROM sys.databases WHERE compatibility_level < 90) | データベースレベルチェックが有効で、古い互換性レベルのDBが存在する場合 |

### 送信抑止条件

| 条件 | 説明 |
|-----|------|
| @CheckUserDatabaseObjects = 0 | データベースレベルチェックが既に無効の場合 |
| 互換性レベル90未満のDBが存在しない | 全データベースが90以上の互換性レベルを持つ場合 |

## 処理フロー

### 送信フロー

```mermaid
flowchart TD
    A[sp_Blitz実行] --> B{@CheckUserDatabaseObjects = 1?}
    B -->|No| Z[通知なし]
    B -->|Yes| C{sys.databasesに<br/>compatibility_level < 90<br/>のレコード存在?}
    C -->|No| D[通常のデータベースチェック実行]
    C -->|Yes| E[@CheckUserDatabaseObjects = 0に設定]
    E --> F[PRINT 警告メッセージ 4行]
    F --> G[#BlitzResultsにCheckID 204挿入]
    G --> H[データベースチェックスキップ]
    D --> I[終了]
    H --> I
    Z --> I
```

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

### 参照テーブル一覧

| テーブル名 | 用途 | 備考 |
|-----------|------|------|
| sys.databases | 互換性レベルのチェック | compatibility_levelカラムを参照 |

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

#### sys.databases

| 参照項目（カラム名） | 用途 | 取得条件 |
|-------------------|------|---------|
| compatibility_level | 互換性レベル値 | WHERE compatibility_level < 90 |

### 更新テーブル一覧

| テーブル名 | 操作 | 概要 |
|-----------|------|------|
| #BlitzResults | INSERT | 検出結果を一時テーブルに挿入 |

#### #BlitzResults

| 操作 | 項目（カラム名） | 更新値 | 備考 |
|-----|-----------------|-------|------|
| INSERT | CheckID | 204 | 固定値 |
| INSERT | Priority | 0 | 情報レベル |
| INSERT | FindingsGroup | 'Informational' | 固定値 |
| INSERT | Finding | '@CheckUserDatabaseObjects Disabled' | 固定値 |
| INSERT | URL | 'https://www.BrentOzar.com/blitz/' | 固定値 |
| INSERT | Details | 詳細メッセージ | 固定テキスト |

## エラー処理

### エラーケース一覧

| エラー種別 | 発生条件 | 対処方法 |
|----------|---------|---------|
| なし | 本通知はエラーではなく情報通知 | @CheckUserDatabaseObjectsを0に設定して処理継続 |

### リトライ仕様

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

## 配信設定

### レート制限

| 項目 | 内容 |
|-----|------|
| 1分あたり上限 | なし |
| 1日あたり上限 | なし |

### 配信時間帯

制限なし（sp_Blitz実行時に即時出力）

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

- 本通知には機密情報は含まれない
- データベース名は直接表示されないが、提示されるクエリを実行することで特定可能

## 備考

- SQL Server 2000（互換性レベル80）のサポートは事実上終了しているが、レガシーシステムでは依然として存在する可能性がある
- この警告が表示された場合でも、sp_Blitz自体は正常に完了する（データベースレベルのチェックのみスキップ）
- メッセージに「Grandpa」というユーモラスな表現が含まれている

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | sp_Blitz.sql | `sp_Blitz.sql` | 互換性レベルチェックのロジック |

**主要処理フロー**:
1. **行756-757**: IF条件でcompatibility_level < 90のデータベース存在チェック
2. **行759**: @CheckUserDatabaseObjects = 0への設定
3. **行760-763**: 4行のPRINT文による警告メッセージ出力
4. **行764-777**: #BlitzResultsへのCheckID 204挿入

**読解のコツ**: 「Antiques Roadshow」（骨董品鑑定番組）というコメントに注目。古い互換性レベルを揶揄している。

#### Step 2: 関連チェックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | sp_Blitz.sql | `sp_Blitz.sql` | 互換性レベル関連の別チェック（CheckID 62） |

**主要処理フロー**:
- **行3730-3735**: CheckID 62でcompatibility_level <= 90のデータベースを検出して報告

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

```
sp_Blitz (エントリーポイント)
    │
    ├─ [初期化処理]
    │
    ├─ [条件チェック] @CheckUserDatabaseObjects = 1?
    │      │
    │      └─ [クエリ実行] SELECT * FROM sys.databases WHERE compatibility_level < 90
    │             │
    │             ├─ [存在する]
    │             │      ├─ SET @CheckUserDatabaseObjects = 0
    │             │      ├─ PRINT 警告メッセージ (4行)
    │             │      └─ INSERT #BlitzResults (CheckID 204)
    │             │
    │             └─ [存在しない] 通常のデータベースチェック実行
    │
    └─ [以降の診断処理]
```

### データフロー図

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

@CheckUserDatabaseObjects ─▶ [条件評価] ──────▶ 処理継続判定
           │
           ▼
     sys.databases ──────▶ [EXISTS クエリ] ──────▶ 検出結果
           │                                         │
           ▼                                         ▼
 compatibility_level < 90              ┌─────────────┴──────────────┐
                                       │                            │
                                       ▼                            ▼
                                 [存在する]                    [存在しない]
                                       │                            │
                                       ▼                            ▼
                    ┌──────────────────┴──────────────────┐    通常処理
                    │                                      │
                    ▼                                      ▼
               PRINT出力                           #BlitzResults挿入
            (4行のメッセージ)                      (CheckID 204)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| sp_Blitz.sql | `sp_Blitz.sql` | ソース | 本通知を発生させるメインプロシージャ（行756-778） |
| Install-All-Scripts.sql | `Install-All-Scripts.sql` | ソース | 全スクリプト一括インストール（行757-778に同一ロジック） |
| Deprecated/sp_Blitz_SQL_Server_2005.sql | `Deprecated/sp_Blitz_SQL_Server_2005.sql` | ソース | SQL Server 2005向け（行4で互換性チェック） |
