# 機能設計書 547-Export-DbaSysDbUserObject

## 概要

本ドキュメントは、SQL Serverシステムデータベース（master, model, msdb）内のユーザー作成オブジェクトを検出しSQLスクリプトファイルにエクスポートするPowerShell関数`Export-DbaSysDbUserObject`の機能設計書である。

### 本機能の処理概要

Export-DbaSysDbUserObjectは、master、model、msdbのシステムデータベースをスキャンし、SQL Server自体ではなくユーザーが作成したテーブル、ビュー、ストアドプロシージャ、関数、トリガー等のオブジェクトを特定する。サーバー移行、コンプライアンス監査、クリーンなシステムデータベース環境の維持に不可欠な、カスタムオブジェクトのドキュメント化を支援する。

**業務上の目的・背景**：DBAは、メンテナンススクリプトや監視ツールなど、カスタムオブジェクトをシステムデータベースに作成することが一般的である。しかし、これらのオブジェクトはサーバー移行時に見落とされやすく、新環境で必要な機能が欠落する原因となる。本機能により、システムデータベース内のカスタムコードを特定し、適切に移行またはドキュメント化できる。

**機能の利用シーン**：
- サーバー移行前のシステムデータベースカスタマイズの棚卸し
- コンプライアンス監査のためのシステムDB変更ドキュメント化
- 新サーバーへのDBAツール展開準備
- システムデータベースのクリーンアップ対象特定

**主要な処理内容**：
1. 対象SQL Serverインスタンスへの接続
2. master, model, msdbの各システムデータベースをスキャン
3. ユーザー作成オブジェクト（IsSystemObject=false）の特定
4. SMO ScriptingOptionsを使用したオブジェクトのスクリプト化
5. Export-DbaScript経由でファイルまたはパイプラインへ出力

**関連システム・外部連携**：SQL Server Management Objects (SMO)を使用。Export-DbaScriptを内部呼び出し。

**権限による制御**：sysadmin権限が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | なし（CLI専用機能） | - | PowerShellコマンドラインから実行 |

## 機能種別

帳票出力 / オブジェクト管理

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter | Yes | 対象SQL Serverインスタンス | ValueFromPipeline |
| SqlCredential | PSCredential | No | SQL Server接続用資格情報 | 有効なPSCredential |
| IncludeDependencies | switch | No | 依存オブジェクトを含める | デフォルト: false |
| BatchSeparator | string | No | バッチ区切り文字 | デフォルト: GO |
| Path | string | No | 出力ディレクトリ | デフォルト: DbatoolsExport |
| FilePath | string | No | 出力ファイルパス | - |
| NoPrefix | switch | No | ヘッダー情報除外 | - |
| ScriptingOptionsObject | ScriptingOptions | No | カスタムスクリプトオプション | - |
| NoClobber | switch | No | 上書き禁止 | - |
| PassThru | switch | No | パイプライン出力 | - |
| EnableException | switch | No | 例外を有効化 | - |

### 入力データソース

- master, model, msdbデータベースのTables、Views、StoredProcedures等のコレクション
- Get-DbaModuleで取得したモジュール情報

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| PassThru時 | string | T-SQLスクリプト文字列 |
| ファイル出力時 | FileInfo | 生成されたスクリプトファイル情報 |

### 出力先

- ファイル出力: Path/FilePathで指定されたSQLスクリプトファイル
- PassThru: PowerShellパイプライン

## 処理フロー

### 処理シーケンス

```
1. インスタンス接続
   └─ Connect-DbaInstance
2. sysadmin権限チェック
   └─ Test-SqlSa
3. システムデータベースループ（master, model, msdb）
   └─ 各DBのユーザーオブジェクト処理
4. ユーザーオブジェクト収集
   └─ Tables, Triggers（IsSystemObject判定）
   └─ Get-DbaModule（ビュー、関数、プロシージャ等）
5. SMOオブジェクト変換
   └─ オブジェクトタイプ別のSMOオブジェクト取得
6. ScriptingOptions設定
   └─ IncludeDatabaseContext, ScriptBatchTerminator等
7. Export-DbaScript呼び出し
   └─ ファイル/パイプライン出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B[インスタンス接続]
    B --> C{sysadmin?}
    C -->|No| D[エラー終了]
    C -->|Yes| E[システムDBループ]
    E --> F[ユーザーテーブル取得]
    F --> G[ユーザートリガー取得]
    G --> H[Get-DbaModule呼び出し]
    H --> I[userObjects結合]
    I --> J{オブジェクトあり?}
    J -->|No| K[次のDB]
    J -->|Yes| L[SMOオブジェクト変換]
    L --> M{NoClobber & ファイル存在?}
    M -->|Yes| N[エラー]
    M -->|No| O[ScriptingOptions設定]
    O --> P[Export-DbaScript呼び出し]
    P --> K
    K --> Q{全DB完了?}
    Q -->|No| E
    Q -->|Yes| R[終了]
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-547-01 | sysadmin必須 | sysadmin権限がない場合はエラー | 常時 |
| BR-547-02 | システムオブジェクト除外 | IsSystemObject=trueのオブジェクトは除外 | 常時 |
| BR-547-03 | 依存関係オプション | IncludeDependenciesでWithDependencies設定 | オプション指定時 |
| BR-547-04 | バッチ区切り | ScriptBatchTerminator=trueで設定 | 常時 |

### 計算ロジック

特になし

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

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

| 操作 | 対象テーブル | 操作種別 | 概要 |
|-----|-------------|---------|------|
| テーブル取得 | sys.tables | SELECT | ユーザーテーブル一覧 |
| トリガー取得 | sys.triggers | SELECT | ユーザートリガー一覧 |
| モジュール取得 | sys.sql_modules | SELECT | ビュー、プロシージャ等 |

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

読み取り専用。システムビューからのSELECTのみ。

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| ConnectionError | 接続エラー | SQL Server接続失敗 | 接続情報を確認 |
| - | 権限エラー | sysadminでない | sysadmin権限を付与 |
| - | ファイルエラー | NoClobber時の既存ファイル | 別パスを指定 |

### リトライ仕様

リトライ機能なし。

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

読み取り専用操作のためトランザクション不要。

## パフォーマンス要件

特に定義なし。

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

- sysadmin権限が必要
- システムデータベースへの読み取りアクセス

## 備考

- Export-DbaScriptを内部で使用
- システムデータベースごとに個別のファイルが生成可能

---

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

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

### 推奨読解順序

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

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Export-DbaSysDbUserObject.ps1 | `public/Export-DbaSysDbUserObject.ps1` | 91-105行目のパラメータ定義 |

#### Step 2: ユーザーオブジェクト収集を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Export-DbaSysDbUserObject.ps1 | `public/Export-DbaSysDbUserObject.ps1` | 124-136行目のオブジェクト収集 |

**主要処理フロー**:
- **127行目**: ユーザーテーブル取得（IsSystemObject判定）
- **128行目**: ユーザートリガー取得
- **129-135行目**: Get-DbaModuleでビュー、関数、プロシージャ等取得

#### Step 3: SMOオブジェクト変換を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Export-DbaSysDbUserObject.ps1 | `public/Export-DbaSysDbUserObject.ps1` | 139-151行目のswitch文 |

**読解のコツ**: オブジェクトタイプ（TABLE, VIEW等）に応じてSMOのコレクションから適切なオブジェクトを取得。

#### Step 4: Export-DbaScript呼び出しを理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 4-1 | Export-DbaSysDbUserObject.ps1 | `public/Export-DbaSysDbUserObject.ps1` | 166-177行目 |

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

```
Export-DbaSysDbUserObject
    │
    ├─ Connect-DbaInstance
    │
    ├─ Test-SqlSa
    │
    ├─ Get-DbaModule
    │
    ├─ New-DbaScriptingOption
    │
    └─ Export-DbaScript
        └─ SMO Scripter
```

### データフロー図

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

SqlInstance       ───▶ Connect-DbaInstance     ───▶ SMO Server Object
    │                                                      │
    ▼                                                      ▼
System DBs        ───▶ Filter User Objects     ───▶ Object Collection
(master/model/msdb)                                        │
    │                                                      ▼
    ▼
SMO Collections   ───▶ Switch by Type          ───▶ SMO Objects
    │                                                      │
    ▼                                                      ▼
Export-DbaScript  ───▶ Scripter.Script()       ───▶ FileInfo / String
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Export-DbaSysDbUserObject.ps1 | `public/Export-DbaSysDbUserObject.ps1` | ソース | メイン関数実装 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server接続 |
| Test-SqlSa.ps1 | `private/functions/Test-SqlSa.ps1` | ソース | sysadminチェック |
| Get-DbaModule.ps1 | `public/Get-DbaModule.ps1` | ソース | モジュール取得 |
| Export-DbaScript.ps1 | `public/Export-DbaScript.ps1` | ソース | スクリプト出力 |
| New-DbaScriptingOption.ps1 | `public/New-DbaScriptingOption.ps1` | ソース | オプション作成 |
