# 画面設計書 224-モジュール取得

## 概要

本ドキュメントは、dbatools PowerShellモジュールにおけるデータベースモジュール取得機能の設計仕様を定義する。SQL Serverデータベース内のストアドプロシージャ、関数、ビュー、トリガーなどのモジュールオブジェクトを、変更日時でフィルタリングして取得する機能を提供するCLIインターフェースである。

### 本画面の処理概要

本機能は、sys.sql_modulesとsys.objectsを結合クエリで検索し、指定された期間内に変更されたデータベースモジュール（コードオブジェクト）を取得する。ストアドプロシージャ、ユーザー定義関数、ビュー、トリガー、デフォルト制約、ルールなど、T-SQLコードを持つオブジェクトが対象となる。

**業務上の目的・背景**：データベースの変更追跡は、トラブルシューティング、監査、デプロイ検証において不可欠である。「最近何が変更されたか」という質問は、インシデント対応や本番環境のコード変更監視で頻繁に発生する。本機能は、メンテナンスウィンドウ後やアプリケーションデプロイ後のコード変更を効率的に特定し、どのストアドプロシージャや関数が更新されたかを一目で把握できるようにする。

**画面へのアクセス方法**：PowerShellコンソールから以下のコマンドを実行することでアクセスする。
- `Get-DbaModule` - データベースモジュールの取得

**主要な操作・処理内容**：
1. 指定日時以降に変更されたモジュールの一覧取得
2. モジュールタイプ（StoredProcedure、View、Function等）によるフィルタリング
3. システムオブジェクトの除外オプション
4. モジュール定義（ソースコード）の取得
5. 複数データベース・複数インスタンスの一括検索

**画面遷移**：本機能はCLIコマンドであり、画面遷移は存在しない。ただし、`Get-DbaDatabase`の出力をパイプラインで渡すワークフローが一般的。

**権限による表示制御**：対象データベースへのVIEW DEFINITION権限が必要。定義（ソースコード）の取得にはオブジェクトに対する適切な権限が必要。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | Get-DbaModule | 主機能 | データベースモジュールの検索と取得 |
| - | Get-DbaDatabase | 関連機能 | データベースオブジェクトの取得（パイプライン入力） |
| - | Get-DbaDbStoredProcedure | 関連機能 | ストアドプロシージャ専用の取得コマンド |
| - | Get-DbaDbView | 関連機能 | ビュー専用の取得コマンド |
| - | Connect-DbaInstance | 関連機能 | SQL Serverインスタンスへの接続確立 |

## 画面種別

CLIコマンド（PowerShell関数）

## URL/ルーティング

PowerShellコマンドレット：
- `Get-DbaModule`

## 入出力項目

### Get-DbaModule パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | 条件付き | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | SQL Server認証用資格情報 |
| Database | object[] | No | 対象データベース名 |
| ExcludeDatabase | object[] | No | 除外するデータベース名 |
| ModifiedSince | datetime | No | この日時以降に変更されたモジュール（デフォルト:1900-01-01） |
| Type | string[] | No | モジュールタイプ（View, StoredProcedure等） |
| ExcludeSystemDatabases | switch | No | システムデータベースを除外 |
| ExcludeSystemObjects | switch | No | システムオブジェクトを除外 |
| InputObject | Database[] | No | パイプライン入力（データベースオブジェクト） |
| EnableException | switch | No | 例外処理モードの切り替え |

### Type パラメータの有効値

| 値 | 説明 |
|-----|------|
| View | ビュー |
| TableValuedFunction | テーブル値関数 |
| DefaultConstraint | デフォルト制約 |
| StoredProcedure | ストアドプロシージャ |
| Rule | ルール |
| InlineTableValuedFunction | インラインテーブル値関数 |
| Trigger | トリガー |
| ScalarFunction | スカラー関数 |

## 表示項目

### Get-DbaModule 出力

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全インスタンス名 |
| Database | string | データベース名 |
| Name | string | モジュール名 |
| ObjectID | int | オブジェクトID |
| SchemaName | string | スキーマ名 |
| Type | string | モジュールタイプ |
| CreateDate | datetime | 作成日時 |
| ModifyDate | datetime | 最終変更日時 |
| IsMsShipped | bool | Microsoft出荷オブジェクトか |
| ExecIsStartUp | bool | スタートアップ実行か（SPのみ） |
| Definition | string | モジュール定義（非表示） |

## イベント仕様

### 1-モジュール取得処理

データベースモジュールを取得する処理フロー：

1. Typeパラメータを内部型名に変換（View→VIEW、StoredProcedure→SQL_STORED_PROCEDURE等）
2. SQLクエリを構築：
   - sys.sql_modulesとsys.objectsを結合
   - ModifiedSince条件を追加
   - ExcludeSystemObjects時はis_ms_shipped = 0条件追加
   - Type指定時はtype_desc IN条件追加
3. SqlInstanceからInputObjectを生成（必要時）
4. 各データベースに対してクエリを実行
5. 結果をPSCustomObjectに変換して出力

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| Get-DbaModule | sys.sql_modules, sys.objects | SELECT | モジュール情報の読み取り |

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

本機能は参照のみであり、データベースの更新は行わない。

## メッセージ仕様

| 種別 | メッセージID | メッセージ内容 | 発生条件 |
|------|-------------|---------------|---------|
| Error | - | You must pipe in a database or specify a SqlInstance | InputObjectもSqlInstanceも指定なし時 |
| Warning | - | Database $db is not accessible. Skipping. | データベースにアクセスできない場合 |
| Verbose | - | Creating InputObject from $SqlInstance | SqlInstanceからInputObject生成時 |
| Verbose | - | Processing $db on $server | データベース処理開始時 |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| 入力なし | Stop-Functionでエラー表示、処理終了 |
| データベースアクセス不可 | Warning表示、次のデータベースへスキップ |
| クエリ実行エラー | エラー内容を伝播 |

## 備考

- Definition列はデフォルトで非表示（Select-Object *で表示可能）
- ModifiedSinceのデフォルト値は1900-01-01（事実上全モジュール取得）
- 結果はmodify_dateでソートされる
- パイプライン入力でGet-DbaDatabase -ExcludeSystem等と組み合わせ可能
- スタートアップ実行フラグはOBJECTPROPERTY関数で取得

---

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

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

### 推奨読解順序

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

出力されるPSCustomObjectの構造を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaModule.ps1 | `public/Get-DbaModule.ps1` | 200-214行目の出力オブジェクト構造 |

**読解のコツ**: Definitionプロパティは`Select-DefaultView -ExcludeProperty Definition`で非表示に設定されている。

#### Step 2: SQLクエリ構築を理解する

動的SQLクエリの構築ロジックを把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaModule.ps1 | `public/Get-DbaModule.ps1` | 138-176行目のbeginブロック |

**主要処理フロー**:
1. **140-151行目**: Typeパラメータの内部型名への変換
2. **154-168行目**: ベースSQLクエリの構築
3. **169-171行目**: ExcludeSystemObjects条件の追加
4. **172-175行目**: Type条件の追加

#### Step 3: InputObject処理を理解する

パイプライン入力とSqlInstance指定の両対応を把握する。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaModule.ps1 | `public/Get-DbaModule.ps1` | 179-188行目のprocessブロック冒頭 |

**主要処理フロー**:
- **180-183行目**: InputObjectとSqlInstance両方なしの場合のエラー処理
- **185-187行目**: SqlInstance指定時にGet-DbaDatabase経由でInputObject生成

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

```
Get-DbaModule
    |
    +-- Get-DbaDatabase（SqlInstance指定時）
    |       +-- Connect-DbaInstance
    |
    +-- $server.Query($sql, $db.name)
    |
    +-- Select-DefaultView（出力整形）
```

### データフロー図

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

パラメータ -------> SQLクエリ構築 -------> Query実行 -------> PSCustomObject
(ModifiedSince等)   動的WHERE句生成       各DB検索          (モジュール情報)

【SQLクエリ】
sys.sql_modules sm
    LEFT JOIN sys.objects so
    WHERE so.modify_date >= '@ModifiedSince'
      AND (so.is_ms_shipped = 0)  -- ExcludeSystemObjects時
      AND type_desc IN (...)      -- Type指定時
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaModule.ps1 | `public/Get-DbaModule.ps1` | ソース | データベースモジュール取得機能 |
| Get-DbaDatabase.ps1 | `public/Get-DbaDatabase.ps1` | ソース | データベースオブジェクト取得（依存） |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続確立（依存） |
