# 機能設計書 14-SqlServerVersions

## 概要

本ドキュメントは、SQL Serverの全バージョン情報（ビルド番号、リリース日、サポート期限等）を格納するテーブル定義とデータスクリプト（SqlServerVersions.sql）の機能設計を記載したものである。

### 本機能の処理概要

**業務上の目的・背景**：SQL Serverのパッチレベルやサポート状況を把握することは、セキュリティ管理とライフサイクル管理において極めて重要である。sp_BlitzやFirst Responder Kitの他のツールは、このテーブルを参照して現在のSQL Serverバージョンが最新かどうか、サポート切れではないかを判定する。本スクリプトは、SQL Server 2008から2025までの全てのメジャー・マイナーバージョン情報を構造化データとして提供する。

**機能の利用シーン**：
- sp_Blitzによるバージョンチェック
- SQL Serverのサポート期限確認
- パッチ適用状況の確認
- バージョンアップ計画の策定
- セキュリティ監査への対応

**主要な処理内容**：
1. dbo.SqlServerVersionsテーブルの存在確認
2. テーブルが存在しない場合は作成（CREATE TABLE）
3. 拡張プロパティの追加（各カラムの説明）
4. 既存データの全削除（DELETE）
5. 最新バージョン情報のINSERT

**関連システム・外部連携**：
- sp_Blitzストアドプロシージャ（参照元）
- その他のFirst Responder Kitプロシージャ
- Microsoft公式バージョン情報（データソース）

**権限による制御**：
- テーブル作成にはdb_ddladmin以上の権限が必要
- データ参照にはSELECT権限が必要

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 1 | sp_Blitz 結果画面 | 参照元 | バージョンチェック時にSqlServerVersionsを参照 |

## 機能種別

参照データ管理・マスタデータ

## 入力仕様

### 入力パラメータ

本スクリプトはパラメータを持たない。スクリプト全体を実行することでテーブル作成・データ投入が完了する。

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| （なし） | - | - | - | - |

### 入力データソース

- SqlServerVersions.sqlファイル本体（506行）
- Microsoft公式バージョン情報（手動更新が必要）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| MajorVersionNumber | tinyint | メジャーバージョン番号（例: 17=SQL Server 2025） |
| MinorVersionNumber | smallint | マイナーバージョン番号（ビルド番号） |
| Branch | varchar(34) | アップデートレベル（CU, SP, RTM, GDR等） |
| Url | varchar(99) | KB記事へのURL |
| ReleaseDate | date | リリース日 |
| MainstreamSupportEndDate | date | メインストリームサポート終了日 |
| ExtendedSupportEndDate | date | 延長サポート終了日 |
| MajorVersionName | varchar(19) | メジャーバージョン名（例: SQL Server 2025） |
| MinorVersionName | varchar(67) | マイナーバージョン名（例: Cumulative Update 1） |

### 出力先

| 出力種別 | 出力先 | 説明 |
|---------|--------|------|
| テーブル | dbo.SqlServerVersions | バージョン情報格納テーブル |

### 収録バージョン範囲

| メジャーバージョン | SQL Server名 | 収録CU/SP数（目安） |
|------------------|--------------|------------------|
| 17 | SQL Server 2025 | CU1まで |
| 16 | SQL Server 2022 | CU23まで |
| 15 | SQL Server 2019 | CU32まで |
| 14 | SQL Server 2017 | CU31まで |
| 13 | SQL Server 2016 | SP3まで |
| 12 | SQL Server 2014 | SP3 CU4まで |
| 11 | SQL Server 2012 | SP4まで |
| 10 | SQL Server 2008/2008 R2 | SP3まで |

## 処理フロー

### 処理シーケンス

```
1. テーブル存在確認
   └─ OBJECT_ID('dbo.SqlServerVersions')がNULLか確認

2. テーブル作成（存在しない場合）
   └─ CREATE TABLE dbo.SqlServerVersions
   └─ PRIMARY KEY (MajorVersionNumber, MinorVersionNumber, ReleaseDate)

3. 拡張プロパティ追加
   └─ sp_addextendedpropertyで各カラムの説明を追加

4. 既存データ削除
   └─ DELETE FROM dbo.SqlServerVersions

5. 最新データ挿入
   └─ INSERT INTO ... VALUES (SQL Server 2025から2008まで)
```

### フローチャート

```mermaid
flowchart TD
    A[スクリプト開始] --> B{SqlServerVersionsテーブル存在確認}
    B -->|存在しない| C[CREATE TABLE実行]
    B -->|存在する| D[DELETE FROMで既存データ削除]
    C --> E[sp_addextendedpropertyで説明追加]
    E --> D
    D --> F[INSERT INTOでバージョンデータ挿入]
    F --> G[SQL Server 2025データ]
    G --> H[SQL Server 2022データ]
    H --> I[SQL Server 2019データ]
    I --> J[以降、2008まで順次挿入]
    J --> K[処理完了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-01 | 冪等性の保証 | スクリプトは何度実行しても同じ結果となる | 常時 |
| BR-02 | 全データ置換 | 既存データを削除して最新データで置換 | DELETE後INSERT |
| BR-03 | 複合主キー | MajorVersionNumber + MinorVersionNumber + ReleaseDateで一意 | 常時 |
| BR-04 | 定期更新推奨 | 新しいCU/SPリリース時にスクリプト更新が必要 | 運用時 |

### 計算ロジック

特になし。参照データの格納のみ。

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| 確認 | sys.objects | SELECT | テーブル存在確認 |
| 作成 | dbo.SqlServerVersions | CREATE TABLE | テーブル新規作成 |
| 削除 | dbo.SqlServerVersions | DELETE | 既存データ全削除 |
| 挿入 | dbo.SqlServerVersions | INSERT | バージョンデータ挿入 |

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

#### dbo.SqlServerVersions

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| INSERT | MajorVersionNumber | 10-17 | SQL Server 2008-2025 |
| INSERT | MinorVersionNumber | ビルド番号 | 例: 4006 (2025 CU1 v2) |
| INSERT | Branch | CU/SP/RTM/GDR | アップデート種別 |
| INSERT | Url | KB記事URL | Microsoft公式 |
| INSERT | ReleaseDate | リリース日 | 公開日 |
| INSERT | MainstreamSupportEndDate | メインストリーム終了日 | |
| INSERT | ExtendedSupportEndDate | 延長サポート終了日 | |
| INSERT | MajorVersionName | バージョン名 | 例: SQL Server 2025 |
| INSERT | MinorVersionName | CU/SP名 | 例: Cumulative Update 1 v2 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 権限エラー | CREATE TABLE権限なし | db_ddladmin以上の権限付与 |
| - | 重複キーエラー | データ整合性の問題 | DELETE後に再実行 |

### リトライ仕様

スクリプトは冪等性を持つため、エラー発生時は原因解消後に再実行可能。

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

各GOステートメントでバッチが区切られる。DELETEとINSERTは同一バッチで実行されるが、明示的なトランザクション制御は行わない。

## パフォーマンス要件

- 実行時間：通常1秒未満
- ファイルサイズ：506行（約50KB）
- データ件数：約450件（2026年2月時点）

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

- 参照のみの用途のため、セキュリティリスクは低い
- 外部URL（Microsoft KB記事）へのリンクを含む
- 機密情報は含まれない

## 備考

- Microsoftが新しいCU/SPをリリースするたびに本スクリプトの更新が必要
- First Responder Kitの新バージョンリリース時に最新データが含まれる
- SQL Server 2025 CU1 v2（2026年1月29日リリース）が最新収録データ

---

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

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

### 推奨読解順序

#### Step 1: テーブル構造を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | SqlServerVersions.sql | `SqlServerVersions.sql` | 2-36行目：テーブル定義と拡張プロパティ |

**読解のコツ**:
- 複合主キー（MajorVersionNumber, MinorVersionNumber, ReleaseDate）に注目
- 同一ビルド番号で複数リリース日がある場合に対応

**主要処理フロー**:
- **2行目**: `IF (OBJECT_ID('dbo.SqlServerVersions') IS NULL)` - 存在確認
- **5-23行目**: CREATE TABLE文、9カラム定義
- **25-34行目**: sp_addextendedpropertyで各カラムの説明を追加

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | SqlServerVersions.sql | `SqlServerVersions.sql` | 39-506行目：バージョンデータ |

**主要処理フロー**:
- **39行目**: `DELETE FROM dbo.SqlServerVersions;` - 既存データ全削除
- **41-43行目**: INSERT INTO文の開始
- **44-51行目**: SQL Server 2025データ（最新）
- **52-83行目**: SQL Server 2022データ
- **83-127行目**: SQL Server 2019データ
- 以降、SQL Server 2017、2016、2014、2012、2008 R2、2008と続く
- **505行目**: 最後のデータ（SQL Server 2008 RTM）
- **506行目**: GOステートメント

#### Step 3: データの読み方を理解する

各行のデータ構造：
```sql
(MajorVersionNumber, MinorVersionNumber, 'Branch', 'Url', 'ReleaseDate', 'MainstreamSupportEndDate', 'ExtendedSupportEndDate', 'MajorVersionName', 'MinorVersionName')
```

例（SQL Server 2025 CU1 v2）：
```sql
(17, 4006, 'CU1 v2', 'https://learn.microsoft.com/...', '2026-01-29', '2031-01-06', '2036-01-06', 'SQL Server 2025', 'Cumulative Update 1 v2')
```

| 値 | 意味 |
|---|------|
| 17 | SQL Server 2025のメジャーバージョン |
| 4006 | ビルド番号 |
| CU1 v2 | 累積更新プログラム1のバージョン2 |
| URL | KB記事へのリンク |
| 2026-01-29 | リリース日 |
| 2031-01-06 | メインストリームサポート終了日 |
| 2036-01-06 | 延長サポート終了日 |

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

```
SqlServerVersions.sql
    │
    ├─ テーブル存在確認
    │      └─ OBJECT_ID('dbo.SqlServerVersions')
    │
    ├─ テーブル作成（条件付き）
    │      └─ CREATE TABLE dbo.SqlServerVersions
    │             └─ PRIMARY KEY (複合)
    │
    ├─ 拡張プロパティ追加
    │      └─ sp_addextendedproperty（9回呼び出し）
    │
    └─ データ操作
           ├─ DELETE（全削除）
           └─ INSERT（約450行）
```

### データフロー図

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

SqlServerVersions.sql ──▶ テーブル作成/更新 ──────────▶ dbo.SqlServerVersions
                                │
Microsoft公式情報 ──────▶ 手動でスクリプト更新            │
（新CU/SPリリース時）                                      │
                                                           ▼
                               sp_Blitz等 ◀─────────── 参照
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| SqlServerVersions.sql | `SqlServerVersions.sql` | ソース | バージョン情報テーブル定義・データ |
| sp_Blitz.sql | `sp_Blitz.sql` | ソース | SqlServerVersionsを参照してバージョンチェック |
| Install-All-Scripts.sql | `Install-All-Scripts.sql` | ソース | SqlServerVersions.sqlを含まない（別途実行が必要） |
| Uninstall.sql | `Uninstall.sql` | ソース | SqlServerVersionsテーブルの削除を含む |

### sp_Blitzでの参照例

sp_Blitzでは以下のようにSqlServerVersionsテーブルを参照してバージョンチェックを行う：

```sql
-- sp_Blitz内での参照イメージ
SELECT TOP 1
    MinorVersionName,
    ReleaseDate
FROM dbo.SqlServerVersions
WHERE MajorVersionNumber = @MajorVersion
  AND MinorVersionNumber >= @CurrentBuild
ORDER BY MinorVersionNumber DESC
```

この結果をもとに「最新ではない」「サポート切れ」などの警告を出力する。
