# 画面設計書：43-ストアドプロシージャ

## 1. 基本情報

| 項目 | 内容 |
|------|------|
| 画面ID | 43 |
| 画面名 | ストアドプロシージャ |
| カテゴリ | Database |
| 対応コマンド | Get-DbaDbStoredProcedure, Find-DbaStoredProcedure |
| 主テンプレートファイル | public/Get-DbaDbStoredProcedure.ps1 |
| 説明 | SQL Serverデータベースのストアドプロシージャの取得・検索機能を提供 |

## 2. 画面概要

ストアドプロシージャ画面は、SQL Serverデータベース内のストアドプロシージャオブジェクトを管理するためのコマンド群を提供します。ストアドプロシージャのメタデータ取得と、定義内のパターン検索による調査機能を含みます。

### 2.1 主要機能

| 機能No | コマンド名 | 機能種別 | 説明 |
|--------|------------|----------|------|
| 661 | Get-DbaDbStoredProcedure | 主機能 | ストアドプロシージャの取得 |
| 660 | Find-DbaStoredProcedure | 補助機能 | ストアドプロシージャの検索 |

## 3. 機能詳細

### 3.1 Get-DbaDbStoredProcedure

#### 目的
SQL Serverデータベースからストアドプロシージャとそのメタデータを取得します。スキーマ、作成日、最終更新日、実装タイプ（T-SQL/CLR）などの詳細情報を含みます。

#### パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|--------------|------|
| SqlInstance | DbaInstanceParameter[] | No | - | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | - | 代替認証情報 |
| Database | object[] | No | - | 対象データベース |
| ExcludeDatabase | object[] | No | - | 除外するデータベース |
| ExcludeSystemSp | switch | No | - | システムストアドを除外 |
| Name | string[] | No | - | 特定のプロシージャ名（2/3パート名対応） |
| Schema | string[] | No | - | 対象スキーマ |
| InputObject | Database[] | No | - | パイプライン入力用 |
| EnableException | switch | No | - | 例外を有効化 |

#### 出力

| 出力型 | 説明 |
|--------|------|
| Microsoft.SqlServer.Management.Smo.StoredProcedure | SMOストアドプロシージャオブジェクト |

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

- ComputerName
- InstanceName
- SqlInstance
- Database
- Schema
- ID as ObjectId
- CreateDate
- DateLastModified
- Name
- ImplementationType
- Startup

#### 処理フロー

1. SqlInstance指定時、Get-DbaDatabase経由でデータベースオブジェクト取得
2. 各データベースのStoredProcedures.ClearAndInitialize()でプロパティ一括読み込み
3. Name指定時、2/3パート名（[database.][schema.]procedure）をパース
4. Schema指定時、該当スキーマのプロシージャのみフィルタ
5. ExcludeSystemSp指定時、IsSystemObject = falseのプロシージャのみ
6. カスタムプロパティ（ComputerName等）を追加して出力

### 3.2 Find-DbaStoredProcedure

#### 目的
ストアドプロシージャ定義（TextBody）内で特定のパターン（正規表現）を検索し、一致したプロシージャと行番号を返します。

#### パラメータ

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

#### 出力

| プロパティ | 型 | 説明 |
|-----------|-----|------|
| ComputerName | string | コンピュータ名 |
| SqlInstance | string | インスタンス名 |
| Database | string | データベース名 |
| DatabaseId | int | データベースID |
| Schema | string | スキーマ名 |
| Name | string | プロシージャ名 |
| Owner | string | 所有者 |
| IsSystemObject | bool | システムオブジェクトフラグ |
| CreateDate | DateTime | 作成日 |
| LastModified | DateTime | 最終更新日 |
| StoredProcedureTextFound | string | 一致した行（行番号付き） |

#### 処理フロー

1. SQL Server 2005以上のバージョンチェック
2. sys.sql_modulesとsys.proceduresを結合するSQLで定義取得
3. IncludeSystemObjects未指定時、is_ms_shipped = 0でフィルタ
4. 各プロシージャのTextBodyに対してPattern照合
5. 一致時、行を分割しSelect-Stringで行番号付きテキスト抽出
6. "(LineNumber: N) テキスト"形式で結果出力

## 4. UI/UX仕様

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

```powershell
# 基本的なストアドプロシージャ取得
Get-DbaDbStoredProcedure -SqlInstance sql2016

# ユーザープロシージャのみ取得
Get-DbaDbStoredProcedure -SqlInstance Server1 -ExcludeSystemSp

# 特定スキーマのプロシージャ取得
Get-DbaDbStoredProcedure -SqlInstance Server1 -Database db1 -Schema dbo

# 2パート名でのプロシージャ取得
Get-DbaDbStoredProcedure -SqlInstance Server1 -Database db1 -Name schema1.proc1

# 3パート名でのプロシージャ取得
Get-DbaDbStoredProcedure -SqlInstance Server1 -Name db1.schema1.proc1

# パイプラインでのデータベース入力
Get-DbaDatabase -SqlInstance Server1 -ExcludeSystem | Get-DbaDbStoredProcedure

# プロシージャ定義内のパターン検索
Find-DbaStoredProcedure -SqlInstance DEV01 -Pattern "CustomerTable"

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

# システムオブジェクト含む検索
Find-DbaStoredProcedure -SqlInstance sql2016 -Database MyDB -Pattern RUNTIME -IncludeSystemObjects
```

### 4.2 出力例

```
ComputerName InstanceName SqlInstance Database Schema ObjectId CreateDate          DateLastModified    Name           ImplementationType Startup
------------ ------------ ----------- -------- ------ -------- ----------          ----------------    ----           ------------------ -------
SERVER1      MSSQLSERVER  SERVER1     db1      dbo    12345    2024-01-15 10:30:00 2024-02-20 14:45:00 usp_GetOrders  TransactSql        False
SERVER1      MSSQLSERVER  SERVER1     db1      dbo    12346    2024-01-20 09:15:00 2024-01-20 09:15:00 usp_UpdateUser TransactSql        False
```

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

### 5.1 エラーケース

| エラー条件 | 対処方法 | 出力 |
|-----------|----------|------|
| データベースアクセス不可 | Write-Message Warning、スキップ | 警告メッセージ |
| プロシージャ名パース失敗 | Write-Message Warning、Continue | 警告メッセージ |
| プロシージャが見つからない | Write-Message Verbose | Verboseメッセージ |
| SQL Server 2005未満 | Write-Message Warning | 処理スキップ |

### 5.2 ConfirmImpact

| コマンド | ConfirmImpact | 説明 |
|----------|---------------|------|
| Get-DbaDbStoredProcedure | なし | 参照のみ |
| Find-DbaStoredProcedure | なし | 参照のみ |

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

### 6.1 必要権限

| 操作 | 必要権限 |
|------|----------|
| プロシージャ取得 | VIEW DEFINITION権限 |
| プロシージャ検索 | VIEW DEFINITION権限 |

### 6.2 暗号化プロシージャ

- 暗号化されたプロシージャはTextBodyが取得不可
- Find-DbaStoredProcedureでの検索対象外

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

### 7.1 StoredProcedures.ClearAndInitialize()

- Get-DbaDbStoredProcedureは初期読み込みを最適化
- 必要なプロパティのみ一括取得（行188）
- 読み込むプロパティ: Schema, Name, ID, CreateDate, DateLastModified, ImplementationType, Startup, IsSystemObject

### 7.2 システムプロシージャ除外

- ExcludeSystemSpの使用推奨
- システムデータベースには多数のシステムプロシージャが存在
- ユーザープロシージャのみの場合、大幅な出力削減

### 7.3 効率的なSQL実行

- Find-DbaStoredProcedureはSQLクエリでsys.sql_modulesから定義を直接取得
- SMO列挙を回避し、パフォーマンス向上

## 8. 関連コマンド

| コマンド | 関連性 |
|----------|--------|
| Get-DbaDatabase | データベースオブジェクト取得 |
| Get-DbaDbView | ビュー管理（類似機能） |
| Find-DbaView | パターン検索（類似機能） |
| Find-DbaTrigger | パターン検索（類似機能） |

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

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

| ファイルパス | 行数 | 役割 |
|-------------|------|------|
| public/Get-DbaDbStoredProcedure.ps1 | 239 | ストアドプロシージャ取得コマンド |
| public/Find-DbaStoredProcedure.ps1 | 200 | ストアドプロシージャ検索コマンド |

### 9.2 データ構造

```
Microsoft.SqlServer.Management.Smo.StoredProcedure
├── Name: プロシージャ名
├── Schema: スキーマ名
├── ID: オブジェクトID
├── CreateDate: 作成日
├── DateLastModified: 最終更新日
├── ImplementationType: 実装タイプ（TransactSql/SqlClr）
├── Startup: スタートアッププロシージャフラグ
├── IsSystemObject: システムオブジェクトフラグ
├── TextBody: プロシージャ定義本体
└── Parent: Database (親データベース)
```

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

```
Get-DbaDbStoredProcedure
├── Get-DbaDatabase (行175-176)
│   └── Connect-DbaInstance
├── Get-ObjectNameParts (行150-165) - 2/3パート名パース
├── StoredProcedures.ClearAndInitialize (行188) - プロパティ一括読み込み
├── Add-Member (行227-231) - カスタムプロパティ追加
└── Select-DefaultView (行233-235) - 出力整形

Find-DbaStoredProcedure
├── Connect-DbaInstance (行126)
├── ExecuteWithResults (行156) - SQL実行
├── Select-String (行171-172) - パターンマッチ
└── Select-DefaultView (行188) - 出力整形
```

### 9.4 データフロー図

```
[SQL Server Instance]
        │
        ▼
   [Connect-DbaInstance]
        │
        ▼
   [Get-DbaDatabase]
        │
        ▼
   ┌─────────────────────────────┐
   │  Database.StoredProcedures │
   │  コレクション               │
   └─────────────────────────────┘
        │
        ├────────────────────────────┐
        │                            │
        ▼                            ▼
[Get-DbaDbStoredProcedure]    [Find-DbaStoredProcedure]
 SMOオブジェクト取得           sys.sql_modules参照
        │                            │
        ▼                            ▼
 [フィルタリング]              [パターンマッチ結果]
  - ExcludeSystemSp             - 行番号付きテキスト
  - Schema                      - StoredProcedureTextFound
  - Name
```

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

1. **2/3パート名サポート**: Get-DbaDbStoredProcedureのNameパラメータは[database.][schema.]procedure形式をサポート
2. **システムプロシージャ**: ExcludeSystemSpを使用しないとシステムプロシージャが含まれる
3. **暗号化プロシージャ**: TextBodyが取得できないため、Find-DbaStoredProcedureでの検索対象外
4. **バージョン制限**: Find-DbaStoredProcedureはSQL Server 2005以上が必要
5. **実装タイプ**: ImplementationTypeでT-SQLとCLRを区別可能
6. **スタートアッププロシージャ**: Startupプロパティでsp_procoption設定を確認可能

## 11. 改訂履歴

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