# 画面設計書：26-データベース状態管理

## 1. 基本情報

| 項目 | 内容 |
|------|------|
| 画面ID | 26 |
| 画面名 | データベース状態管理 |
| カテゴリ | データベース |
| 対応コマンド | Get-DbaDbState |
| 関連機能No | 110 |

## 2. 概要・目的

データベースの状態情報（読み取り/書き込み状態、可用性状態、ユーザーアクセスモード）を取得する機能です。sys.databasesから3つの主要な状態プロパティを取得し、接続性問題のトラブルシューティングやメンテナンス準備に活用します。

システムデータベース（master, model, msdb, tempdb, distribution）はデフォルトで除外されます。

## 3. 機能説明

### 3.1 取得する状態プロパティ

| プロパティ | 説明 | 値 |
|-----------|------|-----|
| RW | 読み取り/書き込み状態 | READ_WRITE, READ_ONLY |
| Status | 可用性状態 | ONLINE, OFFLINE, EMERGENCY, RESTORING |
| Access | ユーザーアクセス制限 | SINGLE_USER, RESTRICTED_USER, MULTI_USER |

### 3.2 SQLバージョン対応

| バージョン | クエリ |
|-----------|--------|
| SQL 2005以上 | sys.databases直接クエリ |
| SQL 2000 | DATABASEPROPERTYEX関数使用 |

## 4. パラメータ仕様

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|-------------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | - | 対象SQLインスタンス |
| SqlCredential | PSCredential | No | - | 認証資格情報 |
| Database | object[] | No | - | 対象データベース |
| ExcludeDatabase | object[] | No | - | 除外データベース |
| EnableException | switch | No | $false | 例外を有効化 |

## 5. 出力仕様

**型**: PSCustomObject

### 5.1 デフォルト表示プロパティ

| プロパティ | 型 | 説明 |
|-----------|-----|------|
| SqlInstance | string | SQLインスタンス名 |
| InstanceName | string | インスタンス名のみ |
| ComputerName | string | コンピュータ名 |
| DatabaseName | string | データベース名 |
| RW | string | 読み取り/書き込み状態 |
| Status | string | 可用性状態 |
| Access | string | ユーザーアクセスモード |

### 5.2 追加プロパティ（非表示）

| プロパティ | 型 | 説明 |
|-----------|-----|------|
| Database | Database | SMO Databaseオブジェクト |

## 6. 処理フロー

```
[開始]
    |
    v
[Connect-DbaInstance]
    | - SqlInstance接続
    v
[バージョン判定]
    | - VersionMajor == 8 -> SQL 2000クエリ
    | - それ以外 -> 標準クエリ
    v
[状態取得クエリ実行]
    | - sys.databasesから状態情報取得
    v
[システムDB除外]
    | - master, model, msdb, tempdb, distribution除外
    v
[Database/ExcludeDatabase フィルタ]
    |
    v
[Hashtable構築]
    | - データベース名をキーとした状態ハッシュ
    v
[結果出力ループ]
    | - Select-DefaultViewでDatabase非表示
    v
[終了]
```

## 7. 内部実装詳細

### 7.1 標準クエリ（SQL 2005以上）

```sql
-- Get-DbaDbState.ps1 行102-109
SELECT
Name   = name,
Access = user_access_desc,
Status = state_desc,
RW     = CASE WHEN is_read_only = 0 THEN 'READ_WRITE' ELSE 'READ_ONLY' END
FROM sys.databases
```

### 7.2 SQL 2000用クエリ

```sql
-- Get-DbaDbState.ps1 行111-118
SELECT
Name   = name,
Access = DATABASEPROPERTYEX(name, 'UserAccess'),
Status = DATABASEPROPERTYEX(name, 'Status'),
RW     = DATABASEPROPERTYEX(name, 'Updateability')
FROM sys.databases
```

### 7.3 システムデータベース除外

```powershell
# Get-DbaDbState.ps1 行133
$dbs = $dbStates | Where-Object {
    @('master', 'model', 'msdb', 'tempdb', 'distribution') -notcontains $_.Name
}
```

### 7.4 大文字小文字対応ハッシュテーブル

```powershell
# Get-DbaDbState.ps1 行140-148
# "normal" hashtable doesn't account for case sensitivity
$dbStatesHash = New-Object -TypeName System.Collections.Hashtable
foreach ($db in $dbStates) {
    $dbStatesHash.Add($db.Name, [PSCustomObject]@{
        Access = $db.Access
        Status = $db.Status
        RW     = $db.RW
    })
}
```

### 7.5 Select-DefaultView適用

```powershell
# Get-DbaDbState.ps1 行160
[PSCustomObject]@{
    SqlInstance  = $server.Name
    ...
    Database     = $server.Databases[$db.Name]
} | Select-DefaultView -ExcludeProperty Database
```

## 8. 使用例

### 8.1 基本的な使用

```powershell
# インスタンス上の全ユーザーデータベース状態を取得
Get-DbaDbState -SqlInstance sqlserver2014a
```

### 8.2 特定データベースの指定

```powershell
# 特定データベースの状態を取得
Get-DbaDbState -SqlInstance sqlserver2014a -Database HR, Accounting
```

### 8.3 除外データベースの指定

```powershell
# HRを除く全データベースの状態を取得
Get-DbaDbState -SqlInstance sqlserver2014a -ExcludeDatabase HR
```

### 8.4 パイプライン入力

```powershell
# 複数インスタンスの状態を取得
'sqlserver2014a', 'sqlserver2014b' | Get-DbaDbState
```

## 9. エラーハンドリング

| エラー状況 | 処理 | ソース位置 |
|-----------|------|-----------|
| 接続失敗 | Stop-Function -Continue | Get-DbaDbState.ps1 行125-127 |

## 10. 関連コマンド

| コマンド | 関係 | 説明 |
|---------|------|------|
| Set-DbaDbState | 関連 | データベース状態を変更 |
| Get-DbaDatabase | 関連 | データベース情報取得 |
| Connect-DbaInstance | 内部使用 | SQLインスタンス接続 |

## 11. 注意事項・制約

1. **システムDB除外**: master, model, msdb, tempdb, distributionは自動除外
2. **大文字小文字**: データベース名は大文字小文字を区別するHashtable使用
3. **SQL 2000対応**: DATABASEPROPERTYEX関数によるフォールバック
4. **SMOオブジェクト**: DatabaseプロパティでSMO Databaseオブジェクトにアクセス可能

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

### 12.1 関連ファイル一覧

| ファイル | 種類 | 行数 | 説明 |
|---------|------|------|------|
| public/Get-DbaDbState.ps1 | メインコマンド | 164 | データベース状態取得 |

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

```
Get-DbaDbState
    |
    +-- Connect-DbaInstance (行124)
    +-- $server.Query (行129 or 131)
    +-- Select-DefaultView (行160)
```

### 12.3 データフロー図

```
[SqlInstance]
    |
    v
[Connect-DbaInstance]
    |
    v
[バージョン判定]
    |
    +-- VersionMajor == 8 --> $DbStatesQuery2000 (DATABASEPROPERTYEX)
    +-- それ以外 ---------> $DbStatesQuery (sys.databases)
    |
    v
[クエリ結果: $dbStates]
    |
    v
[システムDB除外フィルタ]
    |
    v
[Database/ExcludeDatabase フィルタ]
    |
    v
[$dbStatesHash構築]
    | - データベース名 -> {Access, Status, RW}
    v
[出力ループ]
    |
    | PSCustomObject + SMO Database
    v
[Select-DefaultView]
    |
    | Database非表示
    v
[出力]
```

### 12.4 読み解きの流れ

1. **beginブロック (行100-120)**
   - $DbStatesQuery定義（SQL 2005以上用）
   - $DbStatesQuery2000定義（SQL 2000用）

2. **processブロック (行121-163)**
   - インスタンスループ（行122）
   - Connect-DbaInstance（行124）
   - バージョン判定とクエリ実行（行128-132）
   - システムDB除外（行133）
   - Database/ExcludeDatabase フィルタ（行134-139）
   - Hashtable構築（行140-148）
   - 出力ループ（行149-161）

## 13. 改訂履歴

| 日付 | バージョン | 変更内容 |
|------|-----------|---------|
| 2026-02-18 | 1.0 | 初版作成 |
