# 画面設計書 18-データベース管理

## 概要

本ドキュメントは、SQL Server データベースの作成・取得・削除・コピー・リネーム・検索・マウント・アンマウント機能を提供するコマンド群の設計仕様を記述したものです。

### 本画面の処理概要

本機能は、SQL Server データベースオブジェクトの包括的な管理機能を提供します。データベースのインベントリ収集、コンプライアンス監査、メンテナンス計画、災害復旧準備に使用されます。

**業務上の目的・背景**：SQL Server データベースの一元的な管理が必要です。SSMS で各インスタンスに個別接続する代わりに、複数インスタンスのデータベースを標準化されたビューで取得・管理できます。データベースの作成、削除、コピー、検索などの操作をPowerShellで効率的に実行できます。

**画面へのアクセス方法**：PowerShell コンソールまたはスクリプトから以下のコマンドを実行してアクセスします。
- `Get-DbaDatabase` - データベース情報の取得
- `New-DbaDatabase` - データベースの新規作成
- `Remove-DbaDatabase` - データベースの削除
- `Copy-DbaDatabase` - データベースのコピー
- `Rename-DbaDatabase` - データベースの名前変更
- `Find-DbaDatabase` - データベースの検索
- `Mount-DbaDatabase` - データベースのアタッチ
- `Dismount-DbaDatabase` - データベースのデタッチ
- `Remove-DbaDbSafely` - 安全なデータベース削除

**主要な操作・処理内容**：
1. SQL Server データベースの詳細情報を取得（状態、サイズ、バックアップ履歴等）
2. ファイルレイアウトと成長設定をカスタマイズしてデータベースを作成
3. 複数のフォールバック方式でデータベースを削除
4. インスタンス間でデータベースをコピー
5. データベースとファイルの名前変更

**画面遷移**：本機能はCLIコマンドです。

**権限による表示制御**：データベースへのアクセス権限が必要です。削除操作にはsysadmin権限が必要です。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 98 | Get-DbaDatabase | 主機能 | データベースオブジェクトとメタデータの取得 |
| 188 | New-DbaDatabase | 主機能 | データベースの新規作成 |
| 203 | Remove-DbaDatabase | 主機能 | データベースの削除 |
| 358 | Copy-DbaDatabase | 補助機能 | データベースのコピー |
| 209 | Rename-DbaDatabase | 補助機能 | データベースの名前変更 |
| 88 | Find-DbaDatabase | 補助機能 | データベースの検索 |
| 181 | Mount-DbaDatabase | 補助機能 | データベースのアタッチ |
| 81 | Dismount-DbaDatabase | 補助機能 | データベースのデタッチ |
| 204 | Remove-DbaDbSafely | 補助機能 | 安全なデータベース削除（バックアップ後） |

## 画面種別

一覧 / 詳細 / 設定

## URL/ルーティング

PowerShell コマンドとして提供（CLIベース）

## 入出力項目

### Get-DbaDatabase パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | 対象のSQL Serverインスタンス |
| SqlCredential | PSCredential | No | 代替認証情報 |
| Database | string[] | No | 取得対象のデータベース名 |
| ExcludeDatabase | string[] | No | 除外するデータベース名 |
| Pattern | string[] | No | 正規表現によるフィルタリングパターン |
| ExcludeUser | switch | No | システムデータベースのみ取得 |
| ExcludeSystem | switch | No | ユーザーデータベースのみ取得 |
| Status | string[] | No | データベース状態でフィルタ（Normal, Offline等） |
| Access | string | No | アクセスモードでフィルタ（ReadOnly, ReadWrite） |
| Owner | string[] | No | 所有者でフィルタ |
| Encrypted | switch | No | TDE有効データベースのみ |
| RecoveryModel | string[] | No | 復旧モデルでフィルタ（Full, Simple, BulkLogged） |
| NoFullBackup | switch | No | フルバックアップなしのデータベースのみ |
| NoFullBackupSince | datetime | No | 指定日以降フルバックアップなし |
| NoLogBackup | switch | No | ログバックアップなしのデータベースのみ |
| NoLogBackupSince | datetime | No | 指定日以降ログバックアップなし |
| IncludeLastUsed | switch | No | 最終使用日時を含める |
| OnlyAccessible | switch | No | アクセス可能なデータベースのみ |
| EnableException | switch | No | 例外を有効化 |

### New-DbaDatabase パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | 対象のSQL Serverインスタンス |
| SqlCredential | PSCredential | No | 代替認証情報 |
| Name | string[] | No | 作成するデータベース名 |
| DataFilePath | string | No | データファイルのディレクトリパス |
| LogFilePath | string | No | ログファイルのディレクトリパス |
| Collation | string | No | データベースの照合順序 |
| RecoveryModel | string | No | 復旧モデル（Full, Simple, BulkLogged） |
| Owner | string | No | データベース所有者 |
| PrimaryFilesize | int | No | プライマリファイルの初期サイズ（MB） |
| PrimaryFileGrowth | int | No | プライマリファイルの成長サイズ（MB） |
| PrimaryFileMaxSize | int | No | プライマリファイルの最大サイズ（MB） |
| LogSize | int | No | ログファイルの初期サイズ（MB） |
| LogGrowth | int | No | ログファイルの成長サイズ（MB） |
| LogMaxSize | int | No | ログファイルの最大サイズ（MB） |
| SecondaryFileCount | int | No | セカンダリファイル数 |
| EnableException | switch | No | 例外を有効化 |

### Remove-DbaDatabase パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | 対象のSQL Serverインスタンス |
| SqlCredential | PSCredential | No | 代替認証情報 |
| Database | object[] | Yes | 削除するデータベース名 |
| InputObject | Database[] | No | パイプラインからのデータベースオブジェクト |
| EnableException | switch | No | 例外を有効化 |

## 表示項目

### Get-DbaDatabase 出力

| 項目名 | 説明 |
|--------|------|
| ComputerName | SQL Serverインスタンスのコンピュータ名 |
| InstanceName | SQL Serverインスタンス名 |
| SqlInstance | 完全なSQL Serverインスタンス名 |
| Name | データベース名 |
| Status | データベース状態（Normal, Offline, Restoring等） |
| IsAccessible | アクセス可能かどうか |
| RecoveryModel | 復旧モデル（Full, Simple, BulkLogged） |
| LogReuseWaitStatus | トランザクションログ再利用待機状態 |
| Size | データベースサイズ（MB） |
| Compatibility | 互換性レベル |
| Collation | 照合順序 |
| Owner | データベース所有者 |
| Encrypted | TDE有効かどうか |
| LastFullBackup | 最終フルバックアップ日時 |
| LastDiffBackup | 最終差分バックアップ日時 |
| LastLogBackup | 最終ログバックアップ日時 |
| LastIndexRead | 最終インデックス読み取り日時（-IncludeLastUsed時） |
| LastIndexWrite | 最終インデックス書き込み日時（-IncludeLastUsed時） |

### Remove-DbaDatabase 出力

| 項目名 | 説明 |
|--------|------|
| ComputerName | SQL Serverインスタンスのコンピュータ名 |
| InstanceName | SQL Serverインスタンス名 |
| SqlInstance | 完全なSQL Serverインスタンス名 |
| Database | 処理されたデータベース名 |
| Status | 処理結果（"Dropped" または エラーメッセージ） |

## イベント仕様

### 1-データベース情報取得

**処理フロー**:
1. `Connect-DbaInstance` でSQL Serverインスタンスに接続
2. `-IncludeLastUsed` 指定時は `sys.dm_db_index_usage_stats` からアクセス情報を取得
3. `sys.databases` から基本情報を取得（バージョンに応じたクエリを使用）
4. フィルタ条件（Database, ExcludeDatabase, Pattern, Status, Access等）を適用
5. バックアップフィルタ（NoFullBackup, NoLogBackup等）を適用
6. `Add-Member` で追加プロパティを付与
7. `Select-DefaultView` で整形して出力

### 2-データベース作成

**処理フロー**:
1. `Connect-DbaInstance` でSQL Serverインスタンスに接続
2. SMO Databaseオブジェクトを作成
3. ファイルグループとファイルの設定を適用
4. `Create()` メソッドでデータベースを作成
5. 作成されたデータベースオブジェクトを出力

### 3-データベース削除

**処理フロー**:
1. `Connect-DbaInstance` でSQL Serverインスタンスに接続
2. システムデータベース（master, model, msdb, tempdb, resource）を除外
3. 削除を3段階で試行:
   - 第1段階: `$server.KillDatabase($db.name)` で削除
   - 第2段階: `ALTER DATABASE SET SINGLE_USER WITH ROLLBACK IMMEDIATE` 後に `DROP DATABASE`
   - 第3段階: SMO `Drop()` メソッドで削除
4. 結果オブジェクトを出力

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| Get-DbaDatabase | sys.databases, sys.dm_db_index_usage_stats | SELECT | データベース情報の取得 |
| New-DbaDatabase | ファイルシステム | CREATE | 新規データベースの作成 |
| Remove-DbaDatabase | ファイルシステム | DROP | データベースの削除 |

## メッセージ仕様

| メッセージ種別 | 条件 | メッセージ内容 |
|---------------|------|---------------|
| Error | 接続失敗 | "Failure" (ConnectionError) |
| Error | ExcludeUserとExcludeSystem両方指定 | "You cannot specify both ExcludeUser and ExcludeSystem." |
| Error | コレクション変更エラー | "Failure. Collection may have been modified..." |
| Warning | バックアップ履歴取得失敗 | 警告メッセージ表示 |

## 備考

- SQL Server 2000+およびAzure SQL Databaseをサポート
- Pattern パラメータは正規表現を使用（SQL LIKEやPowerShellワイルドカードではない）
- Get-DbaDatabase は SMO Database オブジェクトを返す（フル機能アクセス可能）
- Remove-DbaDatabase は3段階のフォールバック方式で確実に削除を試行
- システムデータベースは削除対象から自動的に除外される

---

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaDatabase.ps1 | `public/Get-DbaDatabase.ps1` | 177-212行: .OUTPUTS セクションでSMO Databaseオブジェクト構造を確認 |
| 1-2 | New-DbaDatabase.ps1 | `public/New-DbaDatabase.ps1` | 105-129行: .OUTPUTS セクションで作成されるデータベースオブジェクト構造を確認 |
| 1-3 | Remove-DbaDatabase.ps1 | `public/Remove-DbaDatabase.ps1` | 49-61行: .OUTPUTS セクションで出力オブジェクト構造を確認 |

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaDatabase.ps1 | `public/Get-DbaDatabase.ps1` | 214-242行: パラメータ定義、多数のフィルタオプション |
| 2-2 | New-DbaDatabase.ps1 | `public/New-DbaDatabase.ps1` | パラメータ定義、ファイルサイズ・成長設定 |
| 2-3 | Remove-DbaDatabase.ps1 | `public/Remove-DbaDatabase.ps1` | 88-100行: パラメータ定義 |

**主要処理フロー (Get-DbaDatabase)**:
- **254-259行**: Connect-DbaInstance で接続確立
- **261-301行**: IncludeLastUsed 時のDMVクエリ実行
- **325-353行**: バージョン別のデータベース情報取得クエリ
- **367-373行**: フィルタ条件の適用
- **413-431行**: バックアップフィルタの適用
- **501-536行**: 出力オブジェクトの構築

**主要処理フロー (Remove-DbaDatabase)**:
- **117-131行**: KillDatabase()による第1削除試行
- **134-145行**: SINGLE_USER設定後のDROP DATABASEによる第2削除試行
- **147-150行**: SMO Drop()による第3削除試行

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

```
Get-DbaDatabase
    |
    +-- Connect-DbaInstance (接続確立)
    |
    +-- [IncludeLastUsed指定時]
    |       +-- sys.dm_db_index_usage_stats クエリ
    |
    +-- Invoke-QueryRawDatabases (バージョン別クエリ)
    |       +-- [Azure] sys.databases + sys.database_principals
    |       +-- [SQL 2000] master.dbo.sysdatabases
    |       +-- [SQL 2005] sys.databases (CDC除く)
    |       +-- [SQL 2008+] sys.databases (CDC含む)
    |
    +-- フィルタ適用 (Database, Pattern, Status, Access等)
    |
    +-- [NoFullBackup/NoLogBackup指定時]
    |       +-- Get-DbaDbBackupHistory
    |
    +-- Add-Member (カスタムプロパティ追加)
    |
    +-- Select-DefaultView (出力整形)

Remove-DbaDatabase
    |
    +-- Connect-DbaInstance (接続確立)
    |
    +-- システムDB除外フィルタ
    |
    +-- [第1試行] $server.KillDatabase()
    |       |
    |       +-- 失敗時 --> [第2試行]
    |
    +-- [第2試行] ALTER DATABASE SET SINGLE_USER + DROP DATABASE
    |       |
    |       +-- 失敗時 --> [第3試行]
    |
    +-- [第3試行] $db.Drop()
    |
    +-- 結果オブジェクト出力
```

### データフロー図

```
                    ┌─────────────────────────────────────┐
                    │         SQL Server Instance         │
                    └─────────────────────────────────────┘
                                      │
                    ┌─────────────────┼─────────────────┐
                    │                 │                 │
               sys.databases    DMVs/DMFs        SMO Objects
                    │                 │                 │
                    ▼                 ▼                 ▼
            ┌───────────────────────────────────────────────┐
            │            Get-DbaDatabase                    │
            │  - データベース情報収集                        │
            │  - フィルタリング                             │
            │  - バックアップ履歴参照                        │
            └───────────────────────────────────────────────┘
                                      │
                                      ▼
                        ┌─────────────────────────┐
                        │  SMO Database Object    │
                        │  + カスタムプロパティ    │
                        └─────────────────────────┘
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaDatabase.ps1 | `public/Get-DbaDatabase.ps1` | ソース | データベース情報取得メインコマンド |
| New-DbaDatabase.ps1 | `public/New-DbaDatabase.ps1` | ソース | データベース作成コマンド |
| Remove-DbaDatabase.ps1 | `public/Remove-DbaDatabase.ps1` | ソース | データベース削除コマンド |
| Copy-DbaDatabase.ps1 | `public/Copy-DbaDatabase.ps1` | ソース | データベースコピーコマンド |
| Rename-DbaDatabase.ps1 | `public/Rename-DbaDatabase.ps1` | ソース | データベース名前変更コマンド |
| Find-DbaDatabase.ps1 | `public/Find-DbaDatabase.ps1` | ソース | データベース検索コマンド |
| Mount-DbaDatabase.ps1 | `public/Mount-DbaDatabase.ps1` | ソース | データベースアタッチコマンド |
| Dismount-DbaDatabase.ps1 | `public/Dismount-DbaDatabase.ps1` | ソース | データベースデタッチコマンド |
