# 画面設計書 171-最終チェックDB

## 概要

本ドキュメントは、dbatools PowerShellモジュールの `Get-DbaLastGoodCheckDb` コマンドの機能仕様を定義した画面設計書です。

### 本画面の処理概要

本コマンドは、SQL Serverデータベースの最終正常DBCC CHECKDB実行日時とデータ整合性ステータスを取得します。

**業務上の目的・背景**：データベース管理者（DBA）は、データベースの整合性チェック（DBCC CHECKDB）が定期的に実行されているか監視する必要があります。本コマンドは、各データベースの最終正常チェック日時を一覧表示し、整合性チェックが遅延しているデータベースを迅速に特定することで、メンテナンス計画の遵守状況を把握し、潜在的なデータ破損リスクを早期に検出できます。

**画面へのアクセス方法**：PowerShellコンソールまたはスクリプトから `Get-DbaLastGoodCheckDb` コマンドを実行します。SQLインスタンスを指定するか、`Get-DbaDatabase` からパイプラインで入力を受け取ることができます。

**主要な操作・処理内容**：
1. 指定されたSQL Serverインスタンスまたはデータベースに接続
2. 各データベースに対してDBCC DBINFO（SQL Server 2008以前）またはSMOのLastGoodCheckDbTimeプロパティ（SQL Server 2008 R2以降）を使用して最終チェック日時を取得
3. データベース作成日時、最終チェックからの経過日数、ステータス（Ok/New database/CheckDB should be performed）を計算
4. Data Purity設定の確認（SQL Server 2008以前またはsysadmin権限がある場合）
5. 結果をPSCustomObjectとしてパイプラインに出力

**画面遷移**：本コマンドは単独実行可能ですが、`Get-DbaDatabase` からパイプライン入力を受け取ることができます。出力結果は `Format-Table`、`Export-Csv` などの他のPowerShellコマンドにパイプで渡すことができます。

**権限による表示制御**：sysadminロールを持つユーザーの場合、CreateVersion、DbccFlagsなどの追加情報が取得できます。非sysadminユーザーはSQL Server 2008 R2以降ではSMOプロパティのみ使用可能で、DataPurityEnabledは$nullとなります。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 128 | Get-DbaLastGoodCheckDb | 主機能 | 最終正常チェックDBの取得 |

## 画面種別

コマンドライン出力（一覧表示）

## URL/ルーティング

PowerShellコマンド: `Get-DbaLastGoodCheckDb`

## 入出力項目

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|---|------|------|
| SqlInstance | DbaInstanceParameter[] | No | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | 認証用資格情報 |
| Database | object[] | No | 対象データベース（ワイルドカード対応） |
| ExcludeDatabase | object[] | No | 除外データベース（ワイルドカード対応） |
| InputObject | object[] | No | パイプライン入力（Database/Serverオブジェクト） |
| EnableException | switch | No | 例外処理モードの有効化 |

## 表示項目

| 項目名 | 型 | 説明 |
|--------|---|------|
| ComputerName | string | SQL Serverホストのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| Database | string | データベース名 |
| DatabaseCreated | datetime | データベース作成日時 |
| LastGoodCheckDb | datetime | 最終正常CHECKDB実行日時（未実行の場合は$null） |
| DaysSinceDbCreated | double | データベース作成からの経過日数 |
| DaysSinceLastGoodCheckDb | int | 最終CHECKDBからの経過日数 |
| Status | string | ステータス（Ok/New database, not checked yet/CheckDB should be performed） |
| DataPurityEnabled | bool | データ純度チェックの有効状態 |
| CreateVersion | int | データベース内部バージョン |
| DbccFlags | int | DBCCフラグ値 |

## イベント仕様

### 1-コマンド実行

1. SqlInstanceまたはInputObjectパラメータを検証
2. 指定されたインスタンス/データベースに接続
3. 各データベースに対してアクセス可能性を確認
4. SQL Server バージョンおよび権限に応じた取得方法を選択：
   - SQL Server 2008以前またはsysadmin: DBCC DBINFO WITH TABLERESULTSを実行
   - SQL Server 2008 R2以降の非sysadmin: SMO LastGoodCheckDbTimeプロパティを使用
5. 取得したデータからステータスを判定（7日以内=Ok、新規DB=New database、それ以外=CheckDB should be performed）
6. PSCustomObjectを生成してパイプラインに出力

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| コマンド実行 | N/A | SELECT | 読み取り専用、更新なし |

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

本コマンドは読み取り専用であり、データベースの更新は行いません。DBCC DBINFOコマンドを使用してシステム情報を取得します。

## メッセージ仕様

| メッセージID | 種別 | 条件 | メッセージ内容 |
|-------------|------|------|--------------|
| M001 | Warning | SqlInstanceもInputObjectも指定されていない | "You must specify either a SQL instance or supply an InputObject" |
| M002 | Error | InputObjectが無効 | "InputObject is not a server or database." |
| M003 | Warning | データベースにアクセスできない | "The database {name} is not accessible. Skipping database." |
| M004 | Verbose | 複数のdbi_dbccLastKnownGoodフィールドが検出された | "The database {db} has {count} dbi_dbccLastKnownGood fields. This script will only use the newest." |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| 接続失敗 | Stop-Functionでエラーを出力し、次のインスタンスに継続 |
| データベースアクセス不可 | 警告メッセージを出力し、次のデータベースに継続 |
| DBCC DBINFO実行エラー | エラー情報を記録し、次のデータベースに継続 |

## 備考

- DBCC DBINFOは未ドキュメント機能のため、将来のSQL Serverバージョンで動作が変更される可能性があります
- DBCC CHECKFILEGROUPやDBCC CHECKDB WITH PHYSICAL_ONLYの実行もLastKnownGood日時を更新します
- READ_ONLYデータベースではLastKnownGood日時は更新されません
- SQL Server 2008R2には、各データベースに2つのdbi_dbccLastKnownGoodフィールドが存在するバグがあり、最新のものが使用されます

---

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

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

### 推奨読解順序

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

PSCustomObjectとして出力されるデータ構造を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaLastGoodCheckDb.ps1 | `public/Get-DbaLastGoodCheckDb.ps1` | 231-244行目：出力オブジェクトのプロパティ定義 |

**読解のコツ**: PowerShellのPSCustomObjectは、@{}構文でプロパティを動的に定義します。出力プロパティを把握することで、関数全体の目的が明確になります。

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

処理の起点となるprocess ブロックを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaLastGoodCheckDb.ps1 | `public/Get-DbaLastGoodCheckDb.ps1` | 128-247行目：processブロック全体 |

**主要処理フロー**:
1. **129-132行目**: パラメータ検証（SqlInstanceまたはInputObjectが必要）
2. **134-136行目**: SqlInstanceが指定された場合、InputObjectに代入
3. **138-157行目**: InputObjectの型に応じた処理分岐
4. **159-245行目**: 各データベースに対するループ処理

#### Step 3: バージョン分岐処理を理解する

SQL Serverバージョンに応じた取得方法の分岐を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaLastGoodCheckDb.ps1 | `public/Get-DbaLastGoodCheckDb.ps1` | 175-200行目：バージョン/権限による分岐 |

**主要処理フロー**:
- **175行目**: SQL Server 2008以前（VersionMajor < 10）またはsysadmin権限がある場合
- **177行目**: DBCC DBINFO WITH TABLERESULTSを実行
- **181行目**: dbi_dbccLastKnownGoodフィールドから日時を抽出
- **197-199行目**: それ以外はSMOのLastGoodCheckDbTimeプロパティを使用

#### Step 4: ステータス判定ロジックを理解する

Statusフィールドの判定ロジックを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Get-DbaLastGoodCheckDb.ps1 | `public/Get-DbaLastGoodCheckDb.ps1` | 214-220行目：ステータス判定 |

**主要処理フロー**:
- **214-215行目**: 最終CHECKDB から7日以内 = "Ok"
- **216-217行目**: データベース作成から7日以内 = "New database, not checked yet"
- **218-219行目**: それ以外 = "CheckDB should be performed"

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

```
Get-DbaLastGoodCheckDb
    |
    +-- Test-Bound (パラメータ検証)
    |
    +-- Write-Message (ログ出力)
    |
    +-- Get-DbaDatabase (データベース取得)
    |      |
    |      +-- Connect-DbaInstance (接続)
    |
    +-- ExecuteWithResults (DBCC DBINFO実行)
    |
    +-- Stop-Function (エラー処理)
```

### データフロー図

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

SqlInstance/       Get-DbaDatabase        DBCC DBINFO/      PSCustomObject
InputObject   ---> でDB一覧取得     ---> SMOで情報取得 ---> (整形された結果)
                        |                     |
                        v                     v
                   各データベース        LastGoodCheckDb
                   をループ処理         Status判定
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaLastGoodCheckDb.ps1 | `public/Get-DbaLastGoodCheckDb.ps1` | ソース | メイン関数実装 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続処理 |
| Get-DbaDatabase.ps1 | `public/Get-DbaDatabase.ps1` | ソース | データベースオブジェクト取得 |
