# バッチ設計書 4-insertTepp.ps1

## 概要

本ドキュメントは、dbatoolsモジュールのTabExpansion++（TEPP）引数補完機能を登録するスクリプト「insertTepp.ps1」の設計仕様を記載したものである。

### 本バッチの処理概要

本スクリプトは、dbatoolsモジュールの全コマンドに対してタブ補完（オートコンプリート）機能を設定する。PowerShellのTabExpansion++フレームワークと連携し、約90個のパラメータに対してインテリジェントな引数補完を提供する。これにより、ユーザーはSQL Serverのデータベース名、ログイン名、ジョブ名などをタブキーで補完できるようになる。

**業務上の目的・背景**：dbatoolsモジュールは700以上のSQL Server管理コマンドを提供しており、各コマンドには多数のパラメータがある。データベース名やログイン名などのパラメータ値を手入力するのは非効率であり、タイプミスの原因にもなる。本スクリプトは、TabExpansion++フレームワークを活用して、接続中のSQL Serverインスタンスからメタデータを取得し、パラメータ値の候補を動的に提示するタブ補完機能を実現する。これにより、ユーザーの作業効率が大幅に向上し、入力ミスも減少する。

**バッチの実行タイミング**：dbatoolsモジュールのインポート時に一度だけ実行される。TabExpansion++が利用可能な場合にのみTEPP機能が有効化される。

**主要な処理内容**：
1. TabExpansion++の利用可能性チェック
2. dbatools全コマンド（*-Dba*パターン）の取得とTabExpansionHostへの登録
3. パラメータ名ベースの自動TEPP登録（約60パラメータ）
4. コマンド固有の明示的TEPP登録（約30パラメータ）

**前後の処理との関連**：本スクリプトはモジュール初期化時にdbatools.psm1から呼び出される。TEPP機能を利用するためにはTabExpansion++モジュールがインストールされている必要がある。updateTeppAsync.ps1スクリプトと連携し、非同期でTEPPキャッシュを更新する。

**影響範囲**：dbatoolsモジュールの全コマンドに対するタブ補完機能に影響する。

## バッチ種別

モジュール初期化 / タブ補完機能登録

## 実行スケジュール

| 項目 | 内容 |
|-----|------|
| 実行頻度 | 1回（モジュールインポート時） |
| 実行時刻 | モジュールインポート時 |
| 実行曜日 | 該当なし |
| 実行日 | 該当なし |
| トリガー | dbatoolsモジュールのインポート |

## 実行条件

### 前提条件

| 条件 | 説明 |
|-----|------|
| dbatoolsモジュールのロード | dbatools.psm1のロード処理中であること |
| TabExpansion++（オプション） | TabExpansion++モジュールがインストールされていればTEPP有効化 |

### 実行可否判定

TabExpansion++のRegister-ArgumentCompleterコマンドが利用可能かチェックし、利用可能な場合のみ$script:TEPP = $trueが設定される。

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|-----|-------------|------|
| なし | - | - | - | 本スクリプトは直接パラメータを受け取らない |

### 入力データソース

| データソース | 形式 | 説明 |
|-------------|------|------|
| ExecutionContext | .NETオブジェクト | コマンド一覧の取得に使用 |
| TabExpansionPlusPlus | PowerShellモジュール | タブ補完フレームワーク |

## 出力仕様

### 出力データ

| 出力先 | 形式 | 説明 |
|-------|------|------|
| TabExpansionHost.DbatoolsCommands | FunctionInfo[] | dbatoolsコマンド一覧の登録 |
| ArgumentCompleter登録 | 内部レジストリ | 各パラメータのタブ補完ハンドラ登録 |

### 出力ファイル仕様

本スクリプトはファイル出力を行わない。

## 処理フロー

### 処理シーケンス

```
1. TabExpansion++の利用可能性チェック
   └─ GetCommand('TabExpansionPlusPlus\Register-ArgumentCompleter')の存在確認
2. TEPPフラグの設定
   └─ $script:TEPP = $true または $false
3. dbatoolsコマンドの取得
   └─ GetCommands('*-Dba*', 'Function', $true)で全コマンド取得
4. TabExpansionHostへの登録
   └─ DbatoolsCommandsプロパティにコマンド一覧を設定
5. 自動TEPP登録（パラメータ名ベース）
   └─ Alert, Database, Login等の共通パラメータに対してTEPP登録
   └─ Exclude*パラメータにも対応
6. 明示的TEPP登録（コマンド固有）
   └─ Import-DbaCsv -Delimiter
   └─ Find-DbaCommand -Tag
   └─ Get-DbatoolsConfig, Set-DbatoolsConfig等
   └─ Get-DbaProcess, Stop-DbaProcess
   └─ XE Session Template, PerfMon Template
   └─ Agent Schedule
   └─ SpConfigure
```

### フローチャート

```mermaid
flowchart TD
    A[スクリプト開始] --> B{TabExpansion++利用可能?}
    B -->|Yes| C[TEPP = true]
    B -->|No| D[TEPP = false]
    C --> E[dbatoolsコマンド取得]
    D --> E
    E --> F[TabExpansionHostに登録]
    F --> G[自動TEPP登録]
    G --> H[明示的TEPP登録]
    H --> I[スクリプト終了]
```

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

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

本スクリプトはデータベース操作を行わない。TEPP補完実行時に別スクリプト（updateTeppAsync.ps1）がSQL Serverに接続する。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| - | TabExpansion++未インストール | TabExpansion++がない | TEPP機能無効化（$script:TEPP = $false） |

### リトライ仕様

| 項目 | 内容 |
|-----|------|
| リトライ回数 | 0回 |
| リトライ間隔 | 該当なし |
| リトライ対象エラー | 該当なし |

### 障害時対応

TabExpansion++が利用できない場合は、TEPP機能が無効化されるだけでモジュール自体は正常に動作する。

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

| 項目 | 内容 |
|-----|------|
| トランザクション範囲 | 該当なし |
| コミットタイミング | 該当なし |
| ロールバック条件 | 該当なし |

## パフォーマンス要件

| 項目 | 内容 |
|-----|------|
| 想定処理件数 | 約90パラメータのTEPP登録 |
| 目標処理時間 | 約143ミリ秒（コメントより） |
| メモリ使用量上限 | 無視できる程度 |

## 排他制御

モジュール初期化時に一度だけ実行されるため、排他制御は不要。

## ログ出力

| ログ種別 | 出力タイミング | 出力内容 |
|---------|--------------|---------|
| なし | - | 本スクリプト自体はログ出力しない |

## 監視・アラート

| 監視項目 | 閾値 | アラート先 |
|---------|-----|----------|
| なし | - | - |

## 備考

- 本スクリプトはprivate/scripts/配下に配置されている
- 処理時間は約143ミリ秒（ソースコードのコメント「this is just 143ms, worth it」より）
- 自動TEPP登録では、パラメータ名に基づいて対応するTEPP補完名を割り当てる
- Exclude*パラメータ（ExcludeDatabase等）にも、対応する通常パラメータと同じTEPP補完を適用
- 明示的TEPP登録では、特定コマンドの特定パラメータに対して個別のTEPP補完を設定

### 自動TEPP登録パラメータ一覧

| パラメータ名 | TEPP名 |
|-------------|--------|
| Alert, ExcludeAlert | Alert |
| AlertCategory, ExcludeAlertCategory | AlertCategory |
| Audit, ExcludeAudit | Audit |
| AuditSpecification, ExcludeAuditSpecification | AuditSpecification |
| AvailabilityGroup, ExcludeAvailabilityGroup | AvailabilityGroup |
| BackupDevice, ExcludeBackupDevice | BackupDevice |
| ConfigName, ExcludeConfigName | ConfigName |
| Credential, ExcludeCredential, CredentialIdentity, ExcludeCredentialIdentity | Credential |
| CustomError, ExcludeCustomError | CustomError |
| Database, ExcludeDatabase | Database |
| Endpoint, ExcludeEndpoint | Endpoint |
| Group, ExcludeGroup | Group |
| Job, ExcludeJob | Job |
| JobCategory, ExcludeJobCategory | JobCategory |
| LinkedServer, ExcludeLinkedServer | LinkedServer |
| Login, ExcludeLogin | Login |
| MailAccount, ExcludeMailAccount | MailAccount |
| MailProfile, ExcludeMailProfile | MailProfile |
| MailServer, ExcludeMailServer | MailServer |
| Operator, ExcludeOperator | Operator |
| ProxyAccount, ExcludeProxyAccount | ProxyAccount |
| ResourcePool, ExcludeResourcePool | ResourcePool |
| Schedule, ExcludeSchedule | Schedule |
| ServerTrigger, ExcludeServerTrigger | ServerTrigger |
| Session, ExcludeSession | Session |
| Snapshot, ExcludeSnapshot | Snapshot |
| SqlInstance | SqlInstance |
| InstanceProperty | InstanceProperty |
| PowerPlan | PowerPlan |
