# 機能設計書 132-Get-DbaModule

## 概要

本ドキュメントは、dbatools PowerShellモジュールの`Get-DbaModule`コマンドレットに関する機能設計書です。このコマンドレットは、指定した日付以降に変更されたデータベースモジュール（ストアドプロシージャ、関数、ビュー、トリガー）を取得する機能を提供します。

### 本機能の処理概要

**業務上の目的・背景**：データベースの変更管理と監査は、システム運用において重要な業務です。アプリケーションのデプロイ後やメンテナンス作業後に、どのデータベースオブジェクトが変更されたかを追跡することで、問題の原因特定やコンプライアンス監査を効率的に行えます。本機能は、sys.sql_modulesとsys.objectsシステムビューを使用して、最近変更されたデータベースモジュールの情報を収集します。

**機能の利用シーン**：
- アプリケーションデプロイ後にどのストアドプロシージャが更新されたか確認する場合
- メンテナンス期間中に変更されたオブジェクトを監査する場合
- トラブルシューティング時に最近変更されたコードを特定する場合
- 複数データベース間でモジュールの変更状況を比較する場合

**主要な処理内容**：
1. 指定されたSQL Serverインスタンスに接続
2. 対象データベースを取得（フィルタリング条件適用）
3. sys.sql_modulesとsys.objectsを結合してモジュール情報をクエリ
4. 変更日時、オブジェクト種別などでフィルタリング
5. 結果をPSCustomObjectとしてパイプラインに出力

**関連システム・外部連携**：
- SQL Server インスタンス（sys.sql_modules、sys.objects システムビュー）
- Get-DbaDatabase コマンドレット（データベース一覧取得）

**権限による制御**：対象データベースに対するVIEW DEFINITION権限が必要です。モジュール定義（Definition プロパティ）を取得するにはこの権限が必須です。

## 関連画面

本機能はコマンドラインツールであり、画面機能マッピングに該当する関連画面はありません。

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | - | - | PowerShellコマンドラインで実行 |

## 機能種別

データ取得 / 監査・変更追跡

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | No | 対象SQL Serverインスタンス | パイプライン入力可 |
| SqlCredential | PSCredential | No | SQL認証用の資格情報 | - |
| Database | object[] | No | 検索対象のデータベース名 | - |
| ExcludeDatabase | object[] | No | 除外するデータベース名 | - |
| ModifiedSince | datetime | No | この日時以降に変更されたモジュールのみ取得（デフォルト: 1900-01-01） | - |
| Type | string[] | No | モジュール種別フィルタ（View, TableValuedFunction, DefaultConstraint, StoredProcedure, Rule, InlineTableValuedFunction, Trigger, ScalarFunction） | ValidateSet |
| ExcludeSystemDatabases | switch | No | システムデータベースを除外 | - |
| ExcludeSystemObjects | switch | No | マイクロソフト提供のシステムオブジェクトを除外 | - |
| InputObject | Database[] | No | Get-DbaDatabase からのパイプライン入力 | パイプライン入力可 |
| EnableException | switch | No | 例外処理を有効化 | - |

### 入力データソース

- SQL Server システムビュー（sys.sql_modules, sys.objects）
- パイプラインからのデータベースオブジェクト

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverのコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なインスタンス名 |
| Database | string | データベース名 |
| Name | string | モジュール名 |
| ObjectID | int | SQL Server オブジェクトID |
| SchemaName | string | スキーマ名 |
| Type | string | モジュール種別（VIEW, SQL_STORED_PROCEDURE, etc.） |
| CreateDate | datetime | 作成日時 |
| ModifyDate | datetime | 最終変更日時 |
| IsMsShipped | bool | マイクロソフト提供オブジェクトかどうか |
| ExecIsStartUp | bool | スタートアップ時に実行されるストアドプロシージャか |
| Definition | string | モジュールのソースコード定義（デフォルト非表示） |

### 出力先

PowerShellパイプライン（PSCustomObject）

## 処理フロー

### 処理シーケンス

```
1. beginブロック: SQLクエリの構築
   ├─ Typeパラメータを内部表現に変換
   └─ 動的SQLを構築（フィルタ条件を追加）

2. processブロック: データベース取得と実行
   ├─ SqlInstanceからデータベース一覧取得（Get-DbaDatabase使用）
   └─ パイプライン入力(InputObject)のマージ

3. 各データベースに対して処理
   ├─ アクセス可能性チェック（IsAccessible）
   ├─ SQLクエリ実行
   └─ 結果をPSCustomObjectに変換して出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[Type変換処理]
    B --> C[SQLクエリ構築]
    C --> D{SqlInstance指定?}
    D -->|Yes| E[Get-DbaDatabase実行]
    D -->|No| F[InputObjectを使用]
    E --> G[InputObjectにマージ]
    F --> G
    G --> H{各データベースに対して}
    H --> I{IsAccessible?}
    I -->|No| J[警告出力・スキップ]
    I -->|Yes| K[SQLクエリ実行]
    J --> H
    K --> L[PSCustomObject出力]
    L --> H
    H -->|完了| M[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-001 | 日付フィルタリング | ModifiedSince以降に変更されたモジュールのみ取得 | 常時（デフォルト1900-01-01） |
| BR-002 | システムオブジェクト除外 | is_ms_shipped = 0の条件を追加 | ExcludeSystemObjects指定時 |
| BR-003 | 種別フィルタリング | type_descが指定された種別に一致するもののみ取得 | Type指定時 |
| BR-004 | アクセス不可DB除外 | IsAccessible = falseのデータベースはスキップ | 常時 |
| BR-005 | Definition非表示 | Select-DefaultViewでDefinitionプロパティを除外 | デフォルト表示時 |

### 計算ロジック

Type名の内部変換：
- View → VIEW
- TableValuedFunction → SQL_TABLE_VALUED_FUNCTION
- DefaultConstraint → DEFAULT_CONSTRAINT
- StoredProcedure → SQL_STORED_PROCEDURE
- Rule → RULE
- InlineTableValuedFunction → SQL_INLINE_TABLE_VALUED_FUNCTION
- Trigger → SQL_TRIGGER
- ScalarFunction → SQL_SCALAR_FUNCTION

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| モジュール取得 | sys.sql_modules, sys.objects | SELECT | データベースモジュール情報の取得 |

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

#### sys.sql_modules (LEFT JOIN sys.objects)

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| SELECT | sm.definition | モジュールのソースコード | - |
| SELECT | so.name, so.object_id, so.schema_id | オブジェクト情報 | - |
| SELECT | so.type, so.type_desc | オブジェクト種別 | - |
| SELECT | so.create_date, so.modify_date | 日時情報 | - |
| SELECT | so.is_ms_shipped | システムオブジェクトフラグ | - |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | 入力エラー | SqlInstanceもInputObjectも指定なし | Stop-Functionでエラーメッセージ表示 |
| - | アクセス不可 | データベースがオフライン等 | 警告メッセージ出力しスキップ |
| - | 権限エラー | VIEW DEFINITION権限なし | 空の結果を返却 |

### リトライ仕様

リトライ処理は実装されていません。

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

読み取り専用クエリのため、トランザクション管理は不要です。

## パフォーマンス要件

- 各データベースに対して1回のSQLクエリ実行
- ORDER BY so.modify_dateでソート済み結果を返却
- 大量のモジュールがある場合、Definitionプロパティは非表示にすることでパフォーマンスを向上

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

- VIEW DEFINITION権限が必要
- SqlCredentialで認証情報を安全に取り扱い
- 機密性の高いモジュール定義は権限で保護

## 備考

- Definitionプロパティは`Select-Object *`で表示可能
- startup属性はOBJECTPROPERTY関数の'ExecIsStartUp'で取得
- システムデータベースを含めたい場合はExcludeSystemDatabasesを指定しない

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Get-DbaModule.ps1 | `public/Get-DbaModule.ps1` | 200-214行目: PSCustomObject出力構造の定義 |

**読解のコツ**: Definitionプロパティは`Select-DefaultView -ExcludeProperty Definition`でデフォルト非表示にされている点に注目。

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Get-DbaModule.ps1 | `public/Get-DbaModule.ps1` | 140-151行目: Type名から内部表現への変換 |
| 2-2 | Get-DbaModule.ps1 | `public/Get-DbaModule.ps1` | 154-177行目: 動的SQLクエリの構築 |

**主要処理フロー**:
1. **142-150行目**: 各Type名を SQL Serverの type_desc 値に変換
2. **154-168行目**: ベースクエリの構築（sys.sql_modules LEFT JOIN sys.objects）
3. **169-176行目**: フィルタ条件の動的追加

#### Step 3: メイン処理フローを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaModule.ps1 | `public/Get-DbaModule.ps1` | 179-188行目: 入力検証とデータベース取得 |
| 3-2 | Get-DbaModule.ps1 | `public/Get-DbaModule.ps1` | 190-216行目: 各データベースの処理ループ |

**主要処理フロー**:
- **180-183行目**: SqlInstanceもInputObjectもない場合はエラー
- **185-188行目**: SqlInstanceからGet-DbaDatabase経由でデータベース取得
- **191-193行目**: アクセス不可データベースのスキップ
- **199-214行目**: クエリ実行と結果出力

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

```
Get-DbaModule
    │
    ├─ begin ブロック
    │      ├─ Type変換処理
    │      └─ SQLクエリ構築
    │
    └─ process ブロック
           │
           ├─ 入力検証
           │      └─ Stop-Function（エラー時）
           │
           ├─ [SqlInstance指定時] Get-DbaDatabase
           │      └─ InputObjectにマージ
           │
           └─ foreach ($db in $InputObject)
                  │
                  ├─ IsAccessibleチェック
                  │      └─ Write-Message（警告）
                  │
                  ├─ $server.Query($sql, $db.name)
                  │
                  └─ PSCustomObject出力
                         └─ Select-DefaultView
```

### データフロー図

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

SqlInstance/InputObject
         │
         ▼
   Get-DbaDatabase ──▶ データベース一覧
         │
         ▼
  foreach Database ──▶ SQL実行 ──▶ sys.sql_modules
         │                         sys.objects
         ▼
   PSCustomObject ──▶ パイプライン出力
         │
         ▼
  Select-DefaultView ──▶ Definition除外表示
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Get-DbaModule.ps1 | `public/Get-DbaModule.ps1` | ソース | メイン処理 |
| Get-DbaDatabase.ps1 | `public/Get-DbaDatabase.ps1` | ソース | データベース一覧取得 |
| Select-DefaultView.ps1 | `private/functions/Select-DefaultView.ps1` | ソース | デフォルト表示制御 |
| Stop-Function.ps1 | `private/functions/flowcontrol/Stop-Function.ps1` | ソース | エラー処理 |
| Write-Message.ps1 | `private/functions/flowcontrol/Write-Message.ps1` | ソース | ログ出力 |
