# 画面設計書：44-トリガー管理

## 1. 基本情報

| 項目 | 内容 |
|------|------|
| 画面ID | 44 |
| 画面名 | トリガー管理 |
| カテゴリ | Database |
| 対応コマンド | Get-DbaDbTrigger, Get-DbaDbObjectTrigger, Find-DbaTrigger |
| 主テンプレートファイル | public/Get-DbaDbTrigger.ps1 |
| 説明 | SQL Serverのデータベースレベル・オブジェクトレベルのトリガーの取得・検索機能を提供 |

## 2. 画面概要

トリガー管理画面は、SQL Serverにおける3つのレベルのトリガー（サーバーレベル、データベースレベルDDL、オブジェクトレベルDML）を管理するためのコマンド群を提供します。トリガーのメタデータ取得と、定義内のパターン検索による調査機能を含みます。

### 2.1 主要機能

| 機能No | コマンド名 | 機能種別 | 説明 |
|--------|------------|----------|------|
| 678 | Get-DbaDbTrigger | 主機能 | データベースレベルDDLトリガーの取得 |
| 677 | Get-DbaDbObjectTrigger | 補助機能 | テーブル・ビューのDMLトリガー取得 |
| 676 | Find-DbaTrigger | 補助機能 | トリガーの検索（全レベル対応） |

## 3. 機能詳細

### 3.1 Get-DbaDbTrigger

#### 目的
データベースレベルのDDLトリガー（CREATE/ALTER/DROP等のイベントに反応）を取得します。セキュリティ監査や変更追跡の分析に有用です。

#### パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|--------------|------|
| SqlInstance | DbaInstanceParameter[] | No | - | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | - | 代替認証情報 |
| Database | object[] | No | - | 対象データベース |
| ExcludeDatabase | object[] | No | - | 除外するデータベース |
| InputObject | Database[] | No | - | パイプライン入力用 |
| EnableException | switch | No | - | 例外を有効化 |

#### 出力

| 出力型 | 説明 |
|--------|------|
| Microsoft.SqlServer.Management.Smo.DatabaseDdlTrigger | SMOデータベースDDLトリガーオブジェクト |

#### デフォルト表示プロパティ

- ComputerName
- InstanceName
- SqlInstance
- Name
- IsEnabled
- DateLastModified

#### 処理フロー

1. SqlInstance指定時、Get-DbaDatabase経由でデータベースオブジェクト取得
2. 各データベースのTriggersコレクションを列挙
3. 各トリガーにカスタムプロパティ（ComputerName等）を追加
4. Select-DefaultViewで出力整形

### 3.2 Get-DbaDbObjectTrigger

#### 目的
テーブルやビューに定義されたDMLトリガー（INSERT/UPDATE/DELETE等のイベントに反応）を取得します。

#### パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|--------------|------|
| SqlInstance | DbaInstanceParameter[] | No | - | 対象インスタンス |
| SqlCredential | PSCredential | No | - | 代替認証情報 |
| Database | object[] | No | - | 対象データベース |
| ExcludeDatabase | object[] | No | - | 除外データベース |
| Type | string | No | All | 対象オブジェクトタイプ（Table/View/All） |
| InputObject | object[] | No | - | パイプライン入力（Table/View） |
| EnableException | switch | No | - | 例外を有効化 |

#### 出力

| 出力型 | 説明 |
|--------|------|
| Microsoft.SqlServer.Management.Smo.Trigger | SMOトリガーオブジェクト |

#### デフォルト表示プロパティ

- ComputerName
- InstanceName
- SqlInstance
- Name
- Parent（親テーブル/ビュー）
- IsEnabled
- DateLastModified

#### 処理フロー

1. InputObject検証（Table/Viewオブジェクトのみ受け入れ）
2. Type=Tableの場合、Get-DbaDbTableでテーブル取得
3. Type=Viewの場合、Get-DbaDbViewでビュー取得
4. 各オブジェクトのTriggersコレクションを列挙
5. カスタムプロパティ追加、出力整形

### 3.3 Find-DbaTrigger

#### 目的
サーバー/データベース/オブジェクトの3レベルのトリガー定義内で特定のパターンを検索します。

#### パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|--------------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | - | 対象インスタンス |
| SqlCredential | PSCredential | No | - | 代替認証情報 |
| Database | object[] | No | - | 対象データベース |
| ExcludeDatabase | object[] | No | - | 除外データベース |
| Pattern | string | Yes | - | 検索パターン（正規表現） |
| TriggerLevel | string | No | All | 検索レベル（Server/Database/Object/All） |
| IncludeSystemObjects | switch | No | - | システムオブジェクトを含める |
| IncludeSystemDatabases | switch | No | - | システムデータベースを含める |
| EnableException | switch | No | - | 例外を有効化 |

#### 出力

| プロパティ | 型 | 説明 |
|-----------|-----|------|
| ComputerName | string | コンピュータ名 |
| SqlInstance | string | インスタンス名 |
| TriggerLevel | string | トリガーレベル（Server/Database/Object） |
| Database | string | データベース名（サーバーレベルはnull） |
| DatabaseId | int | データベースID |
| Object | object | 親オブジェクト（DDLはDatabase、DMLはTable/View） |
| Name | string | トリガー名 |
| IsSystemObject | bool | システムオブジェクトフラグ |
| CreateDate | DateTime | 作成日 |
| LastModified | DateTime | 最終更新日 |
| TriggerTextFound | string | 一致した行（行番号付き） |

#### 処理フロー

1. SQL Server 2005以上のバージョンチェック
2. Database未指定時のみサーバーレベルトリガーを検索
3. TriggerLevel=Server: $server.Triggersを検索
4. TriggerLevel=Database: sys.triggersのparent_class = 0を検索
5. TriggerLevel=Object: sys.triggersのparent_class = 1を検索
6. パターンマッチ時、行番号付きテキストを抽出

## 4. UI/UX仕様

### 4.1 コマンドライン操作

```powershell
# データベースDDLトリガーの取得
Get-DbaDbTrigger -SqlInstance sql2017

# 特定データベースのトリガー取得
Get-DbaDbTrigger -SqlInstance sql2017 -Database supa

# パイプラインでのデータベース入力
Get-DbaDatabase -SqlInstance sql2017 -Database supa | Get-DbaDbTrigger

# テーブル・ビューのDMLトリガー取得
Get-DbaDbObjectTrigger -SqlInstance sql2017

# テーブルトリガーのみ取得
Get-DbaDbObjectTrigger -SqlInstance sql2017 -Type Table

# ビュートリガーのみ取得
Get-DbaDbObjectTrigger -SqlInstance sql2017 -Type View

# 全レベルのトリガー検索
Find-DbaTrigger -SqlInstance DEV01 -Pattern "AuditLog"

# メールアドレスパターンの検索
Find-DbaTrigger -SqlInstance sql2016 -Pattern '\w+@\w+\.\w+'

# 特定レベルのみ検索
Find-DbaTrigger -SqlInstance sql2016 -Database MyDB -TriggerLevel Object
```

### 4.2 出力例

```
# Get-DbaDbTrigger
ComputerName InstanceName SqlInstance Name              IsEnabled DateLastModified
------------ ------------ ----------- ----              --------- ----------------
SERVER1      MSSQLSERVER  SERVER1     trg_AuditChanges  True      2024-01-15 10:30:00

# Find-DbaTrigger
ComputerName SqlInstance TriggerLevel Database Name              TriggerTextFound
------------ ----------- ------------ -------- ----              ----------------
SERVER1      MSSQLSERVER Server       null     trg_ServerLogon   (LineNumber: 5) INSERT INTO AuditLog
SERVER1      MSSQLSERVER Database     db1      trg_DDLAudit      (LineNumber: 8) INSERT INTO AuditLog
SERVER1      MSSQLSERVER Object       db1      trg_Customers     (LineNumber: 12) INSERT INTO AuditLog
```

## 5. エラーハンドリング

### 5.1 エラーケース

| エラー条件 | 対処方法 | 出力 |
|-----------|----------|------|
| データベースアクセス不可 | Write-Message Warning | 警告メッセージ |
| 不正なInputObject型 | Stop-Function、Continue | エラーメッセージ |
| SQL Server 2005未満 | Write-Message Warning | 処理スキップ |
| トリガー取得失敗 | Stop-Function、Continue | エラーメッセージ |

### 5.2 ConfirmImpact

| コマンド | ConfirmImpact | 説明 |
|----------|---------------|------|
| Get-DbaDbTrigger | なし | 参照のみ |
| Get-DbaDbObjectTrigger | なし | 参照のみ |
| Find-DbaTrigger | なし | 参照のみ |

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

### 6.1 必要権限

| 操作 | 必要権限 |
|------|----------|
| トリガー取得 | VIEW DEFINITION権限 |
| トリガー検索 | VIEW DEFINITION権限 |

### 6.2 暗号化トリガー

- 暗号化されたトリガーはTextBodyが取得不可
- Find-DbaTriggerでの検索対象外

## 7. パフォーマンス考慮事項

### 7.1 TriggerLevelによる検索範囲制御

- TriggerLevel指定で検索範囲を限定可能
- 全レベル検索（All）は時間がかかる可能性
- 特定レベルのみの検索推奨

### 7.2 IncludeSystemObjects

- IncludeSystemObjectsはパフォーマンスに大きな影響
- システムトリガーを含めると検索対象が増加
- 必要な場合のみ使用

### 7.3 効率的なSQL実行

- Find-DbaTriggerはSQLクエリでsys.triggersから定義を直接取得
- IncludeSystemObjects未指定時、is_ms_shipped = 0でフィルタ

## 8. 関連コマンド

| コマンド | 関連性 |
|----------|--------|
| Get-DbaDatabase | データベースオブジェクト取得 |
| Get-DbaDbTable | テーブル取得（DMLトリガーの親） |
| Get-DbaDbView | ビュー取得（DMLトリガーの親） |
| Find-DbaStoredProcedure | パターン検索（類似機能） |
| Find-DbaView | パターン検索（類似機能） |

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

### 9.1 関連ファイル一覧

| ファイルパス | 行数 | 役割 |
|-------------|------|------|
| public/Get-DbaDbTrigger.ps1 | 117 | データベースDDLトリガー取得 |
| public/Get-DbaDbObjectTrigger.ps1 | 147 | オブジェクトDMLトリガー取得 |
| public/Find-DbaTrigger.ps1 | 366 | 全レベルトリガー検索 |

### 9.2 データ構造

```
トリガー階層構造:
├── Server.Triggers (サーバーレベルトリガー)
│   └── ServerDdlTrigger
├── Database.Triggers (データベースレベルDDLトリガー)
│   └── DatabaseDdlTrigger
└── Table/View.Triggers (オブジェクトレベルDMLトリガー)
    └── Trigger

Microsoft.SqlServer.Management.Smo.DatabaseDdlTrigger
├── Name: トリガー名
├── IsEnabled: 有効/無効
├── CreateDate: 作成日
├── DateLastModified: 最終更新日
├── TextBody: トリガー定義本体
├── EventSet: 対象イベント
└── Parent: Database

Microsoft.SqlServer.Management.Smo.Trigger (DML)
├── Name: トリガー名
├── IsEnabled: 有効/無効
├── CreateDate: 作成日
├── DateLastModified: 最終更新日
├── TextBody: トリガー定義本体
└── Parent: Table/View
```

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

```
Get-DbaDbTrigger
├── Get-DbaDatabase (行101-102)
│   └── Connect-DbaInstance
├── Database.Triggers (行106) - DDLトリガーコレクション
├── Add-Member (行107-109) - カスタムプロパティ追加
└── Select-DefaultView (行110) - 出力整形

Get-DbaDbObjectTrigger
├── Get-DbaDbTable (行127) - Typeがテーブルの場合
├── Get-DbaDbView (行130) - Typeがビューの場合
├── Object.Triggers (行136) - DMLトリガーコレクション
├── Add-Member (行137-139) - カスタムプロパティ追加
└── Select-DefaultView (行140) - 出力整形

Find-DbaTrigger
├── Connect-DbaInstance (行139)
├── Server.Triggers (行151) - サーバーレベル検索
├── ExecuteWithResults (行208, 245) - SQL実行
│   ├── $sqlDatabaseTriggers (行127) - DDLトリガークエリ
│   └── $sqlTableTriggers (行129-130) - DMLトリガークエリ
├── Select-String (行157, 221, 265) - パターンマッチ
└── Select-DefaultView (行173, 237, 281) - 出力整形
```

### 9.4 データフロー図

```
[SQL Server Instance]
        │
        ├─────────────────────────────────┐
        │                                 │
        ▼                                 ▼
[Server.Triggers]                  [Get-DbaDatabase]
サーバーレベルトリガー                    │
        │                                 │
        │                    ┌────────────┴────────────┐
        │                    │                         │
        │                    ▼                         ▼
        │           [Database.Triggers]        [Tables/Views]
        │           DDLトリガー                      │
        │                    │                        │
        │                    │                        ▼
        │                    │              [Object.Triggers]
        │                    │               DMLトリガー
        │                    │                        │
        └────────────────────┴────────────────────────┘
                              │
                              ▼
                     [Find-DbaTrigger]
                     全レベル検索可能
                              │
                              ▼
                     [パターンマッチ結果]
                     TriggerLevel別に出力
```

## 10. 注意事項・制限事項

1. **トリガーレベル**: SQL Serverには3つのトリガーレベルが存在（Server/Database/Object）
2. **データベース指定時**: Find-DbaTriggerでDatabase指定時、サーバーレベルトリガーは検索対象外
3. **Type指定**: Get-DbaDbObjectTriggerのTypeでTable/Viewのフィルタが可能
4. **暗号化トリガー**: TextBodyが取得できないため、検索対象外
5. **バージョン制限**: Find-DbaTriggerはSQL Server 2005以上が必要
6. **InputObject検証**: Get-DbaDbObjectTriggerはTableViewBase型のみ受け入れ

## 11. 改訂履歴

| バージョン | 日付 | 変更内容 | 作成者 |
|-----------|------|----------|--------|
| 1.0 | 2026-02-18 | 初版作成 | dbatools team + Claude |
