# 画面設計書 173-依存関係取得

## 概要

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

### 本画面の処理概要

本コマンドは、SQL Serverオブジェクトの依存関係をマッピングし、適切なデプロイメント順序で作成スクリプトを生成します。

**業務上の目的・背景**：データベースオブジェクト（テーブル、ビュー、ストアドプロシージャ、関数など）には相互依存関係があり、変更やマイグレーションの際に依存オブジェクトへの影響を把握する必要があります。本コマンドを使用することで、DBAは特定のオブジェクトを変更した場合の影響範囲を事前に分析し、オブジェクトを新しい環境にデプロイする際の正しい順序を決定できます。

**画面へのアクセス方法**：PowerShellコンソールまたはスクリプトから `Get-DbaDependency` コマンドを実行します。SMOオブジェクト（Get-DbaDatabase、Get-DbaDbTable などから取得）をパイプラインで入力します。

**主要な操作・処理内容**：
1. 入力オブジェクト（テーブル、ビュー、プロシージャなど）のURNを取得
2. SMO Scripterを使用してDependencyTreeを探索
3. 依存関係ツリーを再帰的に読み取り、階層（Tier）を割り当て
4. 各依存オブジェクトのT-SQL作成スクリプトを生成
5. 結果をDataplat.Dbatools.Database.Dependencyオブジェクトとして出力

**画面遷移**：本コマンドは `Get-DbaDatabase`、`Get-DbaDbTable`、`Get-DbaDbStoredProcedure` などからパイプライン入力を受け取ります。出力結果は `Export-DbaScript` や他のPowerShellコマンドにパイプで渡すことができます。

**権限による表示制御**：オブジェクトのメタデータ読み取り権限が必要です。スキーマバインドオブジェクトの情報も取得されます。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 116 | Get-DbaDependency | 主機能 | オブジェクト依存関係の取得 |

## 画面種別

コマンドライン出力（階層構造一覧表示）

## URL/ルーティング

PowerShellコマンド: `Get-DbaDependency`

## 入出力項目

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|---|------|------|
| InputObject | object | No | 依存関係を分析するSMOオブジェクト（パイプライン入力） |
| AllowSystemObjects | switch | No | システムオブジェクトを結果に含める |
| Parents | switch | No | 依存方向を逆転（入力オブジェクトが依存するオブジェクトを表示） |
| IncludeSelf | switch | No | 入力オブジェクト自身を結果に含める |
| EnableException | switch | No | 例外処理モードの有効化 |

## 表示項目

| 項目名 | 型 | 説明 |
|--------|---|------|
| ComputerName | string | SQL Serverコンピュータ名 |
| ServiceName | string | SQL Serverサービス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| Dependent | string | 依存オブジェクト名 |
| Type | string | SMOオブジェクトタイプ（Table, View, StoredProcedure, UserDefinedFunction等） |
| Owner | string | オブジェクトのスキーマ/所有者 |
| IsSchemaBound | bool | スキーマバインドかどうか |
| Parent | string | 親オブジェクト名 |
| ParentType | string | 親オブジェクトのSMOタイプ |
| Tier | int | デプロイメント階層（1=最下位の依存関係、数値が大きいほど上位） |
| Object | object | 依存オブジェクトのSMOインスタンス |
| Urn | string | オブジェクトのURN（Uniform Resource Name） |
| OriginalResource | object | 分析対象の元のオブジェクト |
| Script | string | T-SQL作成スクリプト |

## イベント仕様

### 1-コマンド実行

1. InputObjectのURNを検証（URNがない場合はエラー）
2. サーバーオブジェクトを親オブジェクトから特定
3. SMO Scripterを使用してDependencyTreeを取得
   - DriAll、WithDependenciesオプションを有効化
   - AllowSystemObjectsパラメータに応じてシステムオブジェクトを含める
4. Read-DependencyTree関数で再帰的にツリーを展開
   - 各ノードにTier値を割り当て
   - Parentsスイッチの場合はTierを負の値で表現
   - 循環参照を検出して警告
5. Get-DependencyTreeNodeDetail関数で各ノードの詳細情報を取得
   - SMOオブジェクトを取得
   - T-SQLスクリプトを生成
6. Select-DependencyPrecedence関数で重複を排除し、Tierでソート

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

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

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

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

本コマンドは読み取り専用であり、データベースの更新は行いません。SMOを通じてメタデータを取得します。

## メッセージ仕様

| メッセージID | 種別 | 条件 | メッセージ内容 |
|-------------|------|------|--------------|
| M001 | Error | URNが無効 | "{Item} is not a valid SMO object" |
| M002 | Error | サーバーオブジェクト特定失敗 | "Failed to find valid server object in input: {Item}" |
| M003 | Warning | 循環参照検出 | "Circular Reference detected. {check}" |
| M004 | Important | 依存関係なし | "No dependencies detected for {Item}" |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| 無効なSMOオブジェクト | Stop-Functionでエラーを出力し、次のオブジェクトに継続 |
| サーバーオブジェクト特定失敗 | Stop-Functionでエラーを出力し、次のオブジェクトに継続 |
| 循環参照 | Write-Messageで警告を出力し、そのブランチの探索を終了 |

## 備考

- 出力のTier値について：
  - 正の値（1, 2, 3...）: 入力オブジェクトに依存するオブジェクト。Tier 1が最下位の依存関係
  - 負の値（-1, -2...）: Parentsスイッチ使用時、入力オブジェクトが依存するオブジェクト
  - 0: IncludeSelfスイッチ使用時の入力オブジェクト自身
- スクリプト出力にはSET ANSI_NULLS ON、SET QUOTED_IDENTIFIER ONは含まれません

---

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

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

### 推奨読解順序

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

出力オブジェクトの型（Dataplat.Dbatools.Database.Dependency）を理解します。

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

**読解のコツ**: New-Object Dataplat.Dbatools.Database.Dependencyで専用の型を使用しています。プロパティは直接代入されます。

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

processブロックの処理フローを確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaDependency.ps1 | `public/Get-DbaDependency.ps1` | 258-289行目：processブロック |

**主要処理フロー**:
1. **261-263行目**: URN検証
2. **266-273行目**: サーバーオブジェクト特定（parentを辿る）
3. **277行目**: Get-DependencyTree呼び出し
4. **285-286行目**: Read-DependencyTree呼び出し
5. **287行目**: 詳細取得とフィルタリング

#### Step 3: ユーティリティ関数を理解する

内部で定義されているユーティリティ関数を確認します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaDependency.ps1 | `public/Get-DbaDependency.ps1` | 108-146行目：Get-DependencyTree関数 |
| 3-2 | Get-DbaDependency.ps1 | `public/Get-DbaDependency.ps1` | 148-176行目：Read-DependencyTree関数 |
| 3-3 | Get-DbaDependency.ps1 | `public/Get-DbaDependency.ps1` | 178-234行目：Get-DependencyTreeNodeDetail関数 |
| 3-4 | Get-DbaDependency.ps1 | `public/Get-DbaDependency.ps1` | 236-255行目：Select-DependencyPrecedence関数 |

**主要処理フロー**:
- **Get-DependencyTree**: SMO Scripterを使用してDependencyTreeを取得
- **Read-DependencyTree**: 再帰的にツリーを展開、Tierを割り当て、循環参照を検出
- **Get-DependencyTreeNodeDetail**: 各ノードの詳細情報とスクリプトを取得
- **Select-DependencyPrecedence**: 重複を排除してTierでソート

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

```
Get-DbaDependency (process)
    |
    +-- URN検証
    |
    +-- サーバーオブジェクト特定 (parent.parent...)
    |
    +-- Get-DependencyTree
    |      |
    |      +-- SMO Scripter初期化
    |      +-- DiscoverDependencies
    |
    +-- Read-DependencyTree (再帰)
    |      |
    |      +-- Tier割り当て
    |      +-- Read-Parent (循環参照チェック)
    |      +-- 子ノード/兄弟ノード処理
    |
    +-- Get-DependencyTreeNodeDetail
    |      |
    |      +-- GetSmoObject
    |      +-- EnumScriptWithList
    |
    +-- Select-DependencyPrecedence
           |
           +-- Group-Object, Sort-Object
```

### データフロー図

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

SMOオブジェクト    ---> Get-DependencyTree        ---> DependencyTree
(Table/View等)          (SMO Scripter)
                             |
                             v
                    Read-DependencyTree
                    (再帰的展開、Tier割当)
                             |
                             v
                    Get-DependencyTreeNodeDetail   ---> Dependency
                    (詳細+スクリプト取得)               オブジェクト
                             |
                             v
                    Select-DependencyPrecedence
                    (重複排除、ソート)
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaDependency.ps1 | `public/Get-DbaDependency.ps1` | ソース | メイン関数実装 |
| Get-DbaDbTable.ps1 | `public/Get-DbaDbTable.ps1` | ソース | テーブルオブジェクト取得（入力元） |
| Get-DbaDbStoredProcedure.ps1 | `public/Get-DbaDbStoredProcedure.ps1` | ソース | ストアドプロシージャ取得（入力元） |
