# 画面設計書 39-スキーマ管理

## 概要

本ドキュメントは、dbatoolsにおけるデータベーススキーマ管理機能の設計仕様を定義する。

### 本画面の処理概要

スキーマ管理機能は、SQL Serverのデータベーススキーマの取得を行うPowerShellコマンドを提供する。スキーマはデータベース内のオブジェクトを論理的にグループ化し、名前空間とセキュリティ境界を提供する仕組みである。

**業務上の目的・背景**：スキーマはデータベース内のオブジェクト（テーブル、ビュー、ストアドプロシージャ等）を組織化するための名前空間である。スキーマごとに所有者を設定でき、オブジェクトの論理的な分類とセキュリティ管理に活用される。本機能は、スキーマの一覧取得、所有者の監査、マイグレーション計画におけるスキーマ構造の確認を支援する。

**画面へのアクセス方法**：PowerShellコンソールまたはスクリプトから以下のコマンドを実行してアクセスする。
- `Get-DbaDbSchema` - データベーススキーマの取得

**主要な操作・処理内容**：
1. スキーマ情報の取得：スキーマ名、所有者、システムスキーマフラグの取得
2. スキーマのフィルタリング：名前、所有者、システムスキーマの有無による絞り込み

**画面遷移**：本機能はCLIベースのため画面遷移は存在しないが、以下のコマンド間で連携が可能。
- `Get-DbaDatabase` から `Get-DbaDbSchema` へパイプライン入力
- 取得したスキーマオブジェクトに対するAlter()やDrop()メソッドの直接実行
- セキュリティ監査ワークフローでのスキーマ所有者確認

**権限による表示制御**：スキーマの参照にはデータベースへのアクセス権限が必要。スキーマの変更・削除にはALTER SCHEMA権限またはdb_owner固定データベースロールのメンバーシップが必要。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 190 | Get-DbaDbSchema | 主機能 | データベーススキーマの取得 |

## 画面種別

CLI（コマンドラインインターフェース）- PowerShellコマンド

## URL/ルーティング

N/A（PowerShellモジュールのコマンドとして提供）

## 入出力項目

### Get-DbaDbSchema

| 項目名 | 型 | 必須 | 説明 |
|--------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | - | 対象SQLインスタンス |
| SqlCredential | PSCredential | - | 代替認証情報 |
| Database | string[] | - | 対象データベース名フィルター |
| Schema | string[] | - | 取得対象スキーマ名フィルター |
| SchemaOwner | string[] | - | スキーマ所有者でフィルター |
| IncludeSystemDatabases | switch | - | システムDBを含める |
| IncludeSystemSchemas | switch | - | システムスキーマを含める |
| InputObject | Database[] | - | パイプライン入力用データベースオブジェクト |
| EnableException | switch | - | 例外処理の有効化 |

## 表示項目

### Get-DbaDbSchema 出力

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQLサーバーのコンピュータ名 |
| InstanceName | string | SQLインスタンス名 |
| SqlInstance | string | 完全なSQLインスタンス名 |
| Name | string | スキーマ名 |
| IsSystemObject | bool | システムオブジェクトフラグ |

### Get-DbaDbSchema 追加プロパティ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| DatabaseName | string | データベース名 |
| DatabaseId | int | データベースID |
| Owner | string | スキーマの所有者 |
| CreateDate | DateTime | スキーマ作成日時 |
| DateLastModified | DateTime | 最終更新日時 |
| ID | int | スキーマのオブジェクトID |
| Urn | string | URN識別子 |

## イベント仕様

### 1-スキーマ取得

Get-DbaDbSchemaコマンド実行時：
1. SqlInstance指定時はGet-DbaDatabaseでデータベースを取得
2. IncludeSystemDatabases未指定時はシステムDBを除外
3. 各データベースのSchemasコレクションを取得
4. IncludeSystemSchemas未指定時はIsSystemObject -eq $falseでフィルター
5. Schemaパラメータ指定時は名前でフィルター
6. SchemaOwnerパラメータ指定時は所有者でフィルター
7. カスタムプロパティ（ComputerName、InstanceName、DatabaseName等）を追加して出力

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| スキーマ取得 | sys.schemas | SELECT | スキーマ情報の参照 |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 表示条件 |
|-------------|------|--------------|----------|
| MSG001 | 詳細 | Processing schema {name} | スキーマ処理中 |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| インスタンス接続失敗 | Stop-Functionでエラー出力して続行 |
| データベースにアクセスできない | スキップして続行 |

## 備考

- システムスキーマには以下が含まれる：
  - dbo: デフォルトスキーマ、データベース所有者
  - sys: システムオブジェクト格納用
  - guest: ゲストアクセス用
  - INFORMATION_SCHEMA: ANSIメタデータビュー用
  - db_owner, db_accessadmin, db_securityadmin等: 固定データベースロール用
- デフォルトではシステムスキーマは出力に含まれない（-IncludeSystemSchemas指定で含める）
- デフォルトではシステムデータベースは対象外（-IncludeSystemDatabases指定で含める）
- 取得したスキーマオブジェクトに対して直接Alter()やDrop()メソッドを実行可能
- スキーマをDrop()する前に、そのスキーマ内のオブジェクトを別スキーマに移動または削除が必要

---

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

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

### 推奨読解順序

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

スキーマ管理で扱う主要なデータ構造はSMOのSchemaオブジェクトである。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaDbSchema.ps1 | `public/Get-DbaDbSchema.ps1` | 出力オブジェクトの構造（行66-87）を確認 |

**読解のコツ**: SchemaオブジェクトのIsSystemObjectプロパティがシステムスキーマとカスタムスキーマを区別する重要なプロパティ。

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

process{}ブロックが処理の起点となる。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaDbSchema.ps1 | `public/Get-DbaDbSchema.ps1` | 行151-169のprocessブロック |

**主要処理フロー（Get-DbaDbSchema）**:
1. **行153-155**: Get-DbaDatabaseでデータベース取得（IncludeSystemDatabases考慮）
2. **行158**: 複合フィルタリング（IsSystemObject、Schema、SchemaOwner）
3. **行160-167**: カスタムプロパティ追加と出力

#### Step 3: フィルタリングロジックを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaDbSchema.ps1 | `public/Get-DbaDbSchema.ps1` | フィルタリング処理（行158） |

**フィルタリングの詳細**:
```powershell
$db.Schemas |
    Where-Object { ($_.IsSystemObject -eq $false) -or ($_.IsSystemObject -eq $IncludeSystemSchemas) } |
    Where-Object { ($_.Name -in $Schema) -or ($null -eq $Schema) } |
    Where-Object { ($_.Owner -in $SchemaOwner) -or ($null -eq $SchemaOwner) }
```

- 第1条件: システムスキーマを除外（IncludeSystemSchemas時は含める）
- 第2条件: 名前フィルター（指定なしは全て）
- 第3条件: 所有者フィルター（指定なしは全て）

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

```
Get-DbaDbSchema
    |
    +-- Get-DbaDatabase (-ExcludeSystem:(-not $IncludeSystemDatabases))
    |
    +-- Database.Schemas (SMOコレクション)
    |
    +-- フィルタリング (IsSystemObject/Schema/SchemaOwner)
    |
    +-- Select-DefaultView (出力整形)
```

### データフロー図

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

SqlInstance    ----->  Connect-DbaInstance
                            |
Database       ----->  フィルタリング           ----->  対象データベース
                            |
IncludeSystemDatabases --> システムDB含める判定
                            |
                     Database.Schemas取得
                            |
IncludeSystemSchemas --->  システムスキーマ含める判定
                            |
Schema         ----->  名前フィルタリング
                            |
SchemaOwner    ----->  所有者フィルタリング
                            |
                     Select-DefaultView          ----->  Schema (スキーマ情報)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaDbSchema.ps1 | `public/Get-DbaDbSchema.ps1` | ソース | スキーマ取得コマンド |
| Get-DbaDatabase.ps1 | `public/Get-DbaDatabase.ps1` | ソース | データベース取得（依存コマンド） |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | インスタンス接続（依存コマンド） |
| New-DbaDbSchema.ps1 | `public/New-DbaDbSchema.ps1` | ソース | スキーマ作成（関連コマンド、存在する場合） |
| Remove-DbaDbSchema.ps1 | `public/Remove-DbaDbSchema.ps1` | ソース | スキーマ削除（関連コマンド、存在する場合） |
