# 機能設計書 532-Get-DbaDbSchema

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおけるGet-DbaDbSchema機能の設計仕様を定義するものである。この機能はSQL Serverインスタンスからデータベーススキーマオブジェクトを取得し、インベントリ管理、セキュリティ監査、管理タスクに活用する。

### 本機能の処理概要

**業務上の目的・背景**：データベーススキーマは、テーブル、ビュー、ストアドプロシージャなどのオブジェクトを論理的にグループ化し、セキュリティ境界を提供する重要な構成要素である。本機能は、スキーマの所有権確認、データベース構成の棚卸し、スキーマレベルのセキュリティ設定確認を効率的に行うために使用される。マイグレーション計画においてスキーマ所有権と構造を保持する必要がある場合にも必須となる。

**機能の利用シーン**：
- データベースドキュメント作成時のスキーマ一覧取得
- セキュリティ監査での所有者確認
- マイグレーション前のスキーマ構成確認
- 特定所有者のスキーマ検索
- マルチテナントアプリケーションのスキーマ管理

**主要な処理内容**：
1. SqlInstanceパラメータまたはパイプライン入力によるデータベースオブジェクト取得
2. 指定されたフィルタ条件（Schema名、SchemaOwner、システムスキーマ含有）に基づくフィルタリング
3. スキーマオブジェクトへの追加プロパティ（ComputerName、InstanceName等）の付与
4. Select-DefaultViewによるデフォルト表示プロパティの設定

**関連システム・外部連携**：
- SQL Server Management Objects (SMO) - Database.Schemasコレクション
- Get-DbaDatabase - データベースオブジェクト取得

**権限による制御**：
- データベースへの接続権限
- スキーマ情報を参照する権限（通常はpublic roleで取得可能）

## 関連画面

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

## 機能種別

参照処理（SELECT）/ データ取得

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | No | 対象SQL Serverインスタンス | 有効なSQL Server接続文字列 |
| SqlCredential | PSCredential | No | SQL Server接続用の代替認証情報 | 有効なPSCredentialオブジェクト |
| Database | string[] | No | 対象データベース名。ワイルドカード対応 | - |
| Schema | string[] | No | 取得対象スキーマ名 | - |
| SchemaOwner | string[] | No | 指定所有者のスキーマをフィルタ | - |
| IncludeSystemDatabases | switch | No | システムデータベースを含める | - |
| IncludeSystemSchemas | switch | No | システムスキーマ（dbo, sys等）を含める | - |
| InputObject | Microsoft.SqlServer.Management.Smo.Database[] | No | パイプライン入力のデータベースオブジェクト | - |
| EnableException | switch | No | 例外を呼び出し元にスローする | - |

### 入力データソース

- パラメータ入力（コマンドライン引数）
- パイプライン入力（Get-DbaDatabase出力）

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverをホストするコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全修飾SQL Serverインスタンス名 |
| Name | string | スキーマ名 |
| IsSystemObject | boolean | システムスキーマかどうか |
| DatabaseName | string | スキーマが存在するデータベース名（追加プロパティ） |
| DatabaseId | int | データベースID（追加プロパティ） |
| Owner | string | スキーマ所有者（SMO Schemaプロパティ） |
| CreateDate | DateTime | 作成日時（SMO Schemaプロパティ） |
| DateLastModified | DateTime | 最終更新日時（SMO Schemaプロパティ） |
| ID | int | スキーマのオブジェクトID（SMO Schemaプロパティ） |

### 出力先

- 標準出力（Microsoft.SqlServer.Management.Smo.Schema）
- パイプライン出力

## 処理フロー

### 処理シーケンス

```
1. パラメータ処理（processブロック）
   ├─ SqlInstanceからGet-DbaDatabase呼び出しでInputObject構築
   └─ ExcludeSystemオプション適用

2. データベースループ処理
   ├─ Database.Schemasコレクション取得
   ├─ システムスキーマフィルタ適用
   ├─ Schema名フィルタ適用
   ├─ SchemaOwnerフィルタ適用
   └─ 各スキーマオブジェクト処理
       ├─ Add-Memberで追加プロパティ付与
       └─ Select-DefaultViewでデフォルト表示設定
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{SqlInstance指定?}
    B -->|Yes| C[Get-DbaDatabase呼び出し]
    B -->|No| D[InputObject使用]
    C --> E[InputObjectに追加]
    D --> E
    E --> F[foreach db in InputObject]
    F --> G[db.Schemasコレクション取得]
    G --> H{IncludeSystemSchemas?}
    H -->|No| I[IsSystemObject=falseでフィルタ]
    H -->|Yes| J[全スキーマ対象]
    I --> K{Schema指定?}
    J --> K
    K -->|Yes| L[Schema名でフィルタ]
    K -->|No| M[全スキーマ対象]
    L --> N{SchemaOwner指定?}
    M --> N
    N -->|Yes| O[Ownerでフィルタ]
    N -->|No| P[全スキーマ対象]
    O --> Q[foreach sch in schemaList]
    P --> Q
    Q --> R[Add-Member追加プロパティ]
    R --> S[Select-DefaultView適用]
    S --> T{次のスキーマ?}
    T -->|Yes| Q
    T -->|No| U{次のDB?}
    U probable|Yes| F
    U -->|No| V[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | デフォルト除外 | システムスキーマ（dbo, sys, guest, INFORMATION_SCHEMA）はデフォルトで除外 | IncludeSystemSchemas未指定時 |
| BR-002 | システムDB除外 | システムデータベースはデフォルトで除外 | IncludeSystemDatabases未指定時 |
| BR-003 | 複合フィルタ | Schema、SchemaOwnerフィルタは AND条件で適用 | 複数フィルタ指定時 |

### 計算ロジック

特になし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| スキーマ取得 | sys.schemas | SELECT | SMO経由でスキーマ情報を取得 |

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

#### sys.schemas

SMO Database.Schemasコレクション経由で取得。内部的にはsys.schemasシステムビューからスキーマメタデータを読み取る。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| ConnectionError | 接続エラー | SQL Server接続失敗 | 接続情報・ネットワークを確認 |
| - | データなし | 条件に合致するスキーマなし | フィルタ条件を見直す |

### リトライ仕様

明示的なリトライ処理は実装されていない。

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

読み取り専用操作のため、トランザクション管理は不要。

## パフォーマンス要件

- スキーマ数が少ないデータベースでは即座に返却
- 多数のデータベースを対象とする場合は順次処理のため時間がかかる可能性

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

- 読み取り専用操作のため、データ変更のリスクなし
- スキーマ所有権情報を取得するため、セキュリティ監査に活用可能

## 備考

- 返却されるSMO Schemaオブジェクトは直接Alter()、Drop()メソッドを呼び出し可能
- Select-DefaultViewにより、デフォルト表示は5プロパティに限定されるが、Select-Object *で全プロパティ取得可能

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaDbSchema.ps1 | `public/Get-DbaDbSchema.ps1` | 出力オブジェクト（SMO Schema + 追加プロパティ）161-166行目 |

**読解のコツ**: Add-Memberで追加されるNotePropertyを確認し、SMO標準プロパティとの関係を把握する。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaDbSchema.ps1 | `public/Get-DbaDbSchema.ps1` | param()ブロック（139-150行目）でパラメータ定義確認 |

**主要処理フロー**:
1. **151行目**: processブロック開始
2. **153-155行目**: SqlInstanceからGet-DbaDatabase呼び出しでInputObject構築
3. **157-158行目**: データベースループとスキーマフィルタリング
4. **160-167行目**: スキーマオブジェクト処理とプロパティ追加

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaDbSchema.ps1 | `public/Get-DbaDbSchema.ps1` | 158行目のWhere-Objectパイプライン |

**主要処理フロー**:
- **158行目**: 3段階のWhere-Objectでフィルタリング
  - IsSystemObjectフィルタ（システムスキーマ除外）
  - Schema名フィルタ
  - SchemaOwnerフィルタ

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

```
Get-DbaDbSchema
    │
    ├─ Get-DbaDatabase（SqlInstance指定時）
    │      └─ データベースオブジェクト取得
    │
    └─ foreach db
           ├─ db.Schemas（SMOコレクション）
           │      └─ Where-Objectフィルタリング
           │
           └─ foreach sch
                  ├─ Add-Member（プロパティ追加）
                  └─ Select-DefaultView（表示設定）
```

### データフロー図

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

SqlInstance ─────────▶ Get-DbaDatabase ───────────▶ Database[]
      or                      │
InputObject ─────────────────┤
                              ▼
                       db.Schemas ─────────────────▶ Schema[]
                              │
                              ▼
                       Where-Object
                       (IsSystemObject,
                        Name, Owner) ──────────────▶ Filtered Schema[]
                              │
                              ▼
                       Add-Member
                       (ComputerName,
                        InstanceName,
                        SqlInstance,
                        DatabaseName,
                        DatabaseId) ───────────────▶ Enriched Schema[]
                              │
                              ▼
                       Select-DefaultView ─────────▶ SMO Schema
                                                     (with default props)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaDbSchema.ps1 | `public/Get-DbaDbSchema.ps1` | ソース | メイン機能実装 |
| Get-DbaDatabase.ps1 | `public/Get-DbaDatabase.ps1` | ソース | データベースオブジェクト取得 |
| Select-DefaultView.ps1 | `private/Select-DefaultView.ps1` | ソース | デフォルト表示プロパティ設定 |
