# 画面設計書：45-UDF管理

## 1. 基本情報

| 項目 | 内容 |
|------|------|
| 画面ID | 45 |
| 画面名 | UDF管理 |
| カテゴリ | Database |
| 対応コマンド | Get-DbaDbUdf, Remove-DbaDbUdf |
| 主テンプレートファイル | public/Get-DbaDbUdf.ps1 |
| 説明 | SQL Serverデータベースのユーザー定義関数（UDF）およびユーザー定義集計（UDA）の取得・削除機能を提供 |

## 2. 画面概要

UDF管理画面は、SQL Serverデータベース内のユーザー定義関数（User Defined Function）とユーザー定義集計（User Defined Aggregate）を管理するためのコマンド群を提供します。関数のメタデータ取得と削除機能を含みます。

### 2.1 主要機能

| 機能No | コマンド名 | 機能種別 | 説明 |
|--------|------------|----------|------|
| 114 | Get-DbaDbUdf | 主機能 | ユーザー定義関数・集計の取得 |
| 207 | Remove-DbaDbUdf | 主機能 | ユーザー定義関数・集計の削除 |

## 3. 機能詳細

### 3.1 Get-DbaDbUdf

#### 目的
SQL Serverデータベースからユーザー定義関数（スカラー関数、テーブル値関数）およびユーザー定義集計を取得します。

#### パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|--------------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | - | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | - | 代替認証情報 |
| Database | object[] | No | - | 対象データベース |
| ExcludeDatabase | object[] | No | - | 除外するデータベース |
| ExcludeSystemUdf | switch | No | - | システムUDFを除外 |
| Schema | string[] | No | - | 対象スキーマ |
| ExcludeSchema | string[] | No | - | 除外スキーマ |
| Name | string[] | No | - | 対象UDF名 |
| ExcludeName | string[] | No | - | 除外UDF名 |
| EnableException | switch | No | - | 例外を有効化 |

#### 出力

| 出力型 | 説明 |
|--------|------|
| Microsoft.SqlServer.Management.Smo.UserDefinedFunction | SMOユーザー定義関数オブジェクト |
| Microsoft.SqlServer.Management.Smo.UserDefinedAggregate | SMOユーザー定義集計オブジェクト |

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

- ComputerName
- InstanceName
- SqlInstance
- Database
- Schema
- CreateDate
- DateLastModified
- Name
- DataType

#### 処理フロー

1. Connect-DbaInstanceでサーバー接続
2. 各データベースのUserDefinedFunctions.ClearAndInitialize()でプロパティ一括読み込み
3. 各データベースのUserDefinedAggregates.ClearAndInitialize()でプロパティ一括読み込み
4. ExcludeSystemUdf指定時、IsSystemObject = falseのUDFのみフィルタ
5. UserDefinedFunctionsとUserDefinedAggregatesを結合
6. Schema/ExcludeSchema/Name/ExcludeNameでフィルタリング
7. カスタムプロパティを追加して出力

### 3.2 Remove-DbaDbUdf

#### 目的
データベースからユーザー定義関数およびユーザー定義集計を削除します。

#### パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|--------------|------|
| SqlInstance | DbaInstanceParameter[] | Yes(NonPipeline) | - | 対象インスタンス |
| SqlCredential | PSCredential | No | - | 代替認証情報 |
| Database | string[] | No | - | 対象データベース |
| ExcludeDatabase | object[] | No | - | 除外データベース |
| ExcludeSystemUdf | switch | No | - | システムUDFを除外 |
| Schema | string[] | No | - | 対象スキーマ |
| ExcludeSchema | string[] | No | - | 除外スキーマ |
| Name | string[] | No | - | 対象UDF名 |
| ExcludeName | string[] | No | - | 除外UDF名 |
| InputObject | object[] | Yes(Pipeline) | - | パイプライン入力 |
| EnableException | switch | No | - | 例外を有効化 |

#### 出力

| プロパティ | 型 | 説明 |
|-----------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全インスタンス名 |
| Database | string | データベース名 |
| Udf | string | スキーマ.UDF名 |
| UdfName | string | UDF名のみ |
| UdfSchema | string | スキーマ名 |
| Status | string | "Dropped" または エラーメッセージ |
| IsRemoved | bool | 削除成功フラグ |

#### 処理フロー

1. beginブロックで空の配列を初期化
2. processブロックでGet-DbaDbUdf経由またはInputObjectからUDF収集
3. endブロックで実際のDrop()実行（コレクション変更問題回避）
4. ShouldProcess確認後、Drop()メソッド呼び出し
5. 成功/失敗結果をPSCustomObjectで出力

## 4. UI/UX仕様

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

```powershell
# 基本的なUDF取得
Get-DbaDbUdf -SqlInstance sql2016

# ユーザーUDFのみ取得（システムUDF除外）
Get-DbaDbUdf -SqlInstance Server1 -ExcludeSystemUdf

# 特定データベースのUDF取得
Get-DbaDbUdf -SqlInstance Server1 -Database db1

# 特定スキーマのUDF取得
Get-DbaDbUdf -SqlInstance Server1 -Database db1 -Schema dbo

# 特定UDFの取得
Get-DbaDbUdf -SqlInstance Server1 -Database db1 -Name fn_CalculateTotal

# UDFの削除
Remove-DbaDbUdf -SqlInstance localhost -Database db1 -Name udf1, udf2

# パイプラインでの削除
Get-DbaDbUdf -SqlInstance localhost -Database db1 -Name udf1 | Remove-DbaDbUdf

# パイプラインでのインスタンス入力
'Sql1','Sql2/sqlexpress' | Get-DbaDbUdf
```

### 4.2 出力例

```
ComputerName InstanceName SqlInstance Database Schema CreateDate          DateLastModified    Name              DataType
------------ ------------ ----------- -------- ------ ----------          ----------------    ----              --------
SERVER1      MSSQLSERVER  SERVER1     db1      dbo    2024-01-15 10:30:00 2024-02-20 14:45:00 fn_CalculateTotal int
SERVER1      MSSQLSERVER  SERVER1     db1      dbo    2024-01-20 09:15:00 2024-01-20 09:15:00 fn_GetFullName    nvarchar
```

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

### 5.1 エラーケース

| エラー条件 | 対処方法 | 出力 |
|-----------|----------|------|
| データベースアクセス不可 | スキップ、次のデータベースへ | 処理継続 |
| UDFが存在しない | Write-Message Verbose | Verboseメッセージ |
| Drop失敗（依存関係等） | Stop-Function、Status=エラーメッセージ | IsRemoved=false |
| 接続失敗 | Stop-Function、Continue | エラーメッセージ |

### 5.2 ConfirmImpact

| コマンド | ConfirmImpact | 説明 |
|----------|---------------|------|
| Get-DbaDbUdf | なし | 参照のみ |
| Remove-DbaDbUdf | High | 確認プロンプト表示 |

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

### 6.1 必要権限

| 操作 | 必要権限 |
|------|----------|
| UDF取得 | VIEW DEFINITION権限 |
| UDF削除 | DROP FUNCTION権限またはdb_ddladmin |

### 6.2 システムUDFの保護

- ExcludeSystemUdfを使用してシステムUDFを除外推奨
- システムUDF削除は予期しない動作を引き起こす可能性

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

### 7.1 ClearAndInitialize()

- UserDefinedFunctionsとUserDefinedAggregatesで別々に初期化
- 必要なプロパティのみ一括取得
- 読み込むプロパティ: Schema, Name, CreateDate, DateLastModified, DataType, IsSystemObject

### 7.2 システムUDF

- 各データベースに100以上のシステムUDFが存在可能
- ExcludeSystemUdfの使用推奨

### 7.3 ユーザー定義集計

- UserDefinedAggregatesにはIsSystemObjectプロパティがない
- 常にユーザー作成オブジェクトとして扱われる

## 8. 関連コマンド

| コマンド | 関連性 |
|----------|--------|
| Get-DbaDatabase | データベースオブジェクト取得 |
| Get-DbaDbStoredProcedure | ストアドプロシージャ管理（類似機能） |
| Get-DbaDbView | ビュー管理（類似機能） |

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

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

| ファイルパス | 行数 | 役割 |
|-------------|------|------|
| public/Get-DbaDbUdf.ps1 | 202 | UDF取得コマンド |
| public/Remove-DbaDbUdf.ps1 | 170 | UDF削除コマンド |

### 9.2 データ構造

```
Microsoft.SqlServer.Management.Smo.UserDefinedFunction
├── Name: 関数名
├── Schema: スキーマ名
├── CreateDate: 作成日
├── DateLastModified: 最終更新日
├── DataType: 戻り値データ型
├── IsSystemObject: システムオブジェクトフラグ
├── IsInlineTableValuedFunction: インラインテーブル値関数フラグ
├── IsSqlTabular: SQLテーブル値関数フラグ
├── AssemblyName: CLR関数のアセンブリ名
└── Parent: Database

Microsoft.SqlServer.Management.Smo.UserDefinedAggregate
├── Name: 集計名
├── Schema: スキーマ名
├── CreateDate: 作成日
├── DateLastModified: 最終更新日
├── DataType: 戻り値データ型
└── Parent: Database
※IsSystemObjectプロパティは存在しない
```

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

```
Get-DbaDbUdf
├── Connect-DbaInstance (行136)
├── UserDefinedFunctions.ClearAndInitialize (行154)
├── UserDefinedAggregates.ClearAndInitialize (行157)
├── IsSystemObjectフィルタ (行161-162) - UDFのみ
├── UDFとUDAの結合 (行167)
├── Schema/Name/Excludeフィルタ (行174-188)
├── Add-Member (行192-195) - カスタムプロパティ追加
└── Select-DefaultView (行197) - 出力整形

Remove-DbaDbUdf
├── Get-DbaDbUdf (行136) - UDF取得
├── ShouldProcess (行145) - 確認プロンプト
├── Udf.Drop() (行158) - SMO削除メソッド
└── Get-ErrorMessage (行163) - エラー処理
```

### 9.4 データフロー図

```
[SQL Server Instance]
        │
        ▼
   [Connect-DbaInstance]
        │
        ▼
   [Get-DbaDatabase]
        │
        ▼
   ┌─────────────────────────────────────┐
   │  Database.UserDefinedFunctions      │
   │  + Database.UserDefinedAggregates   │
   └─────────────────────────────────────┘
        │
        ├── ExcludeSystemUdfフィルタ（UDFのみ）
        │
        ├── Schema/Name/Excludeフィルタ
        │
        ▼
   [Get-DbaDbUdf]
   統合出力
        │
        ▼
   [Remove-DbaDbUdf]
   Drop()実行
```

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

1. **UDFとUDAの統合**: Get-DbaDbUdfはUserDefinedFunctionsとUserDefinedAggregatesを統合して出力
2. **IsSystemObject**: UserDefinedAggregatesにはIsSystemObjectプロパティがない
3. **システムUDF**: 各データベースに100以上のシステムUDFが存在可能、ExcludeSystemUdf推奨
4. **CLR関数**: AssemblyName/ClassNameプロパティでCLR関数を識別可能
5. **削除時の依存関係**: 他のオブジェクトから参照されているUDFは削除に失敗する可能性

## 11. 改訂履歴

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