# 画面設計書 233-システムDBユーザーオブジェクト

## 概要

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

### 本画面の処理概要

**業務上の目的・背景**：システムデータベースにユーザーオブジェクトが存在すると、サーバー移行時やコンプライアンス監査時に問題が発生する可能性があります。本コマンドは、master、model、msdb データベース内のカスタムテーブル、ビュー、ストアドプロシージャ、関数、トリガーなどを特定し、再作成用の SQL スクリプトを生成することで、サーバー移行やドキュメント化を支援します。

**画面へのアクセス方法**：PowerShell コンソールまたはスクリプトから `Export-DbaSysDbUserObject` コマンドを実行します。パイプライン入力として SQL Server インスタンスを受け取ることも可能です。

**主要な操作・処理内容**：
1. 指定された SQL Server インスタンスに接続（sysadmin 権限が必要）
2. master、model、msdb の各システムデータベースをスキャン
3. IsSystemObject が false のオブジェクト（ユーザー作成オブジェクト）を抽出
4. SMO ScriptingOptions を使用して CREATE スクリプトを生成
5. 指定されたパスに SQL ファイルとして出力、または PassThru でパイプライン出力

**画面遷移**：CLI コマンドのため画面遷移は存在しませんが、出力ファイルは他のスクリプトやツールで使用可能です。

**権限による表示制御**：sysadmin 権限が必要です。権限がない場合は処理が停止されます。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 547 | Export-DbaSysDbUserObject | 主機能 | システムDBユーザーオブジェクトのエクスポート |
| 542 | Copy-DbaSystemDbUserObject | 補助機能 | システムDBユーザーオブジェクトのコピー |
| 90 | Connect-DbaInstance | 補助機能 | SQL Server インスタンスへの接続 |
| 224 | Get-DbaModule | 補助機能 | データベースモジュールの取得 |
| 216 | Export-DbaScript | 補助機能 | オブジェクトのスクリプト出力 |

## 画面種別

CLI コマンド（エクスポート）

## URL/ルーティング

PowerShell コマンド: `Export-DbaSysDbUserObject`

## 入出力項目

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter | Yes | 対象 SQL Server インスタンス |
| SqlCredential | PSCredential | No | 代替認証情報 |
| IncludeDependencies | switch | No | 依存オブジェクトを含める |
| BatchSeparator | string | No | バッチ区切り文字（デフォルト: GO） |
| Path | string | No | 出力ディレクトリパス |
| FilePath | string | No | 出力ファイルの完全パス |
| NoPrefix | switch | No | ヘッダー情報を除外 |
| ScriptingOptionsObject | ScriptingOptions | No | カスタムスクリプティングオプション |
| NoClobber | switch | No | 既存ファイルの上書き禁止 |
| PassThru | switch | No | スクリプトをコンソールに出力 |
| EnableException | switch | No | 例外を有効化 |

### 出力項目

#### PassThru 使用時

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| (文字列) | string | T-SQL CREATE スクリプト |

#### Path/FilePath 使用時

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| Name | string | 出力ファイル名 |
| FullName | string | 出力ファイルの完全パス |
| Directory | DirectoryInfo | 出力ディレクトリ |
| CreationTime | DateTime | ファイル作成日時 |
| LastWriteTime | DateTime | ファイル最終更新日時 |
| Length | long | ファイルサイズ（バイト） |
| Extension | string | ファイル拡張子（.sql） |

## 表示項目

エクスポート対象のオブジェクトタイプ：

| タイプ | 説明 |
|--------|------|
| TABLE | ユーザーテーブル |
| VIEW | ビュー |
| SQL_STORED_PROCEDURE | ストアドプロシージャ |
| RULE | ルール |
| SQL_TRIGGER | トリガー |
| SQL_TABLE_VALUED_FUNCTION | テーブル値関数 |
| SQL_INLINE_TABLE_VALUED_FUNCTION | インラインテーブル値関数 |
| SQL_SCALAR_FUNCTION | スカラー関数 |

## イベント仕様

### 1-コマンド実行

1. SqlInstance パラメータで指定されたインスタンスに接続
2. sysadmin 権限をチェック（Test-SqlSa）
3. 各システムデータベース（master、model、msdb）で以下を実行:
   - テーブル（IsSystemObject = false）を抽出
   - トリガー（IsSystemObject = false）を抽出
   - Get-DbaModule でモジュール（View、Function、StoredProcedure 等）を取得
4. SMO オブジェクトを取得して Export-DbaScript でスクリプト化
5. 指定に応じてファイル出力または PassThru でパイプライン出力

## データベース更新仕様

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| オブジェクト検索 | sys.tables | SELECT | ユーザーテーブルの取得 |
| オブジェクト検索 | sys.triggers | SELECT | ユーザートリガーの取得 |
| オブジェクト検索 | sys.objects | SELECT | ユーザーオブジェクトの取得 |

### テーブル別更新項目詳細

このコマンドは読み取り専用であり、データベースの更新は行いません。

## メッセージ仕様

| 種別 | メッセージ | 条件 |
|------|----------|------|
| Verbose | "Attempting to connect to $instance" | 接続開始時 |
| Error | "Not a sysadmin on $instance. Quitting." | sysadmin 権限なし |
| Error | "File already exists. If you want to overwrite it remove the -NoClobber parameter." | ファイル存在時（NoClobber） |
| Error | "Exporting system objects failed on '{0}'" | エクスポート失敗時 |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| 接続失敗 | Stop-Function で警告を表示し、次のインスタンスへ続行 |
| sysadmin 権限なし | Stop-Function で処理停止 |
| ファイル既存（NoClobber） | Stop-Function で警告を表示し続行 |
| スクリプティングエラー | Stop-Function でエラー表示 |

## 備考

- sysadmin 権限が必須
- IncludeDependencies で依存オブジェクトもスクリプトに含めることが可能
- ScriptingOptions でスクリプト生成の詳細をカスタマイズ可能
- デフォルトでは IncludeDatabaseContext = true（USE ステートメントを含む）
- BatchSeparator は SQL スクリプトのバッチ区切り（デフォルト: GO）
- 出力ファイル名形式: `{server}-Export-DbaSysDbUserObject-{database}-{timestamp}.sql`

---

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

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

### 推奨読解順序

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

対象となるオブジェクトタイプと出力形式を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Export-DbaSysDbUserObject.ps1 | `public/Export-DbaSysDbUserObject.ps1` | 行127-135: ユーザーオブジェクト収集ロジック |

**読解のコツ**: Get-DbaModule の Type パラメータで取得対象オブジェクトタイプを確認する。

#### Step 2: エントリーポイントを理解する

処理の起点となるファイル・関数を特定します。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Export-DbaSysDbUserObject.ps1 | `public/Export-DbaSysDbUserObject.ps1` | 関数全体の構造と処理フロー |

**主要処理フロー**:
1. **行106-114**: 接続と sysadmin 権限チェック
2. **行116-119**: Test-SqlSa による権限確認
3. **行122-135**: システムデータベースごとのオブジェクト収集
4. **行137-164**: スクリプティングオプション設定と Export-DbaScript 呼び出し
5. **行172-176**: 結果出力（ファイルまたは PassThru）

#### Step 3: スクリプティング処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Export-DbaSysDbUserObject.ps1 | `public/Export-DbaSysDbUserObject.ps1` | 行139-164: SMO オブジェクト取得とスイッチ処理 |
| 3-2 | Export-DbaSysDbUserObject.ps1 | `public/Export-DbaSysDbUserObject.ps1` | 行156-164: ScriptingOptions 設定 |

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

```
Export-DbaSysDbUserObject
    │
    ├─ Connect-DbaInstance (行111)
    │      └─ SQL Server SMO 接続
    │
    ├─ Test-SqlSa (行116)
    │      └─ sysadmin 権限確認
    │
    ├─ Get-ExportFilePath (行120)
    │      └─ 出力パス決定
    │
    ├─ システムDB処理ループ (行124)
    │      ├─ $smoDb.Tables (行127)
    │      ├─ $smoDb.Triggers (行128)
    │      └─ Get-DbaModule (行135)
    │
    ├─ New-DbaScriptingOption (行157)
    │      └─ スクリプティングオプション作成
    │
    └─ Export-DbaScript (行173-175)
           └─ SQL スクリプト生成
```

### データフロー図

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

SqlInstance ───────────▶ Connect-DbaInstance ───────────▶ Server Object
                               │
                         Test-SqlSa チェック
                               │
                         システムDB ループ
                               │
master/model/msdb ────────────▶ SMO オブジェクト収集 ──────▶ $userObjects[]
                               │
                         SMO オブジェクト取得
                               │
                         Export-DbaScript
                               │
Path/FilePath ───────────────▶ ファイル出力 ───────────────▶ FileInfo
      or
PassThru ────────────────────▶ パイプライン出力 ───────────▶ String[]
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Export-DbaSysDbUserObject.ps1 | `public/Export-DbaSysDbUserObject.ps1` | ソース | メインコマンド実装 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server 接続処理 |
| Get-DbaModule.ps1 | `public/Get-DbaModule.ps1` | ソース | データベースモジュール取得 |
| Export-DbaScript.ps1 | `public/Export-DbaScript.ps1` | ソース | スクリプトエクスポート |
| New-DbaScriptingOption.ps1 | `public/New-DbaScriptingOption.ps1` | ソース | スクリプティングオプション作成 |
