# 画面設計書 232-ユーザーオブジェクト検索

## 概要

本ドキュメントは、dbatools PowerShell モジュールの `Find-DbaUserObject` コマンドに関する設計書です。このコマンドは、SQL Server インスタンス内で sa や dbo 以外のユーザーが所有するオブジェクトを検索し、セキュリティ監査やユーザー管理に必要な情報を提供します。

### 本画面の処理概要

**業務上の目的・背景**：ユーザーアカウントの削除やセキュリティレビューを行う際、対象ユーザーが所有するオブジェクトを事前に特定することは重要です。所有者が不明確なオブジェクトは依存関係の破損やセキュリティリスクにつながる可能性があります。本コマンドは、データベース、SQL Agent ジョブ、資格情報、プロキシ、エンドポイント、サーバーロール、スキーマ、データベースロール、アセンブリ、シノニムなど、幅広いオブジェクトタイプの所有権を検索します。

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

**主要な操作・処理内容**：
1. 指定された SQL Server インスタンスに接続
2. サーバーレベルオブジェクト（データベース、ジョブ、資格情報、プロキシ、エンドポイント、サーバーロール）の所有権を検索
3. 各データベース内のオブジェクト（スキーマ、ロール、アセンブリ、シノニム）の所有権を検索
4. Pattern パラメータ指定時は正規表現でフィルタリング
5. 結果をパイプラインに即時出力

**画面遷移**：CLI コマンドのため画面遷移は存在しませんが、出力結果は他の dbatools コマンドにパイプライン接続可能です。

**権限による表示制御**：対象オブジェクトへのアクセス権限が必要です。IsAccessible プロパティでアクセス可能なデータベースのみ処理されます。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 550 | Find-DbaUserObject | 主機能 | ユーザーオブジェクトの検索 |
| 90 | Connect-DbaInstance | 補助機能 | SQL Server インスタンスへの接続 |
| 65 | Get-DbaLogin | 関連機能 | ログイン情報の取得 |

## 画面種別

CLI コマンド（検索・一覧表示）

## URL/ルーティング

PowerShell コマンド: `Find-DbaUserObject`

## 入出力項目

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|-----|------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | 対象 SQL Server インスタンス |
| SqlCredential | PSCredential | No | 代替認証情報 |
| Pattern | string | No | 所有者検索の正規表現パターン |
| EnableException | switch | No | 例外を有効化 |

### 出力項目

| プロパティ名 | 型 | 説明 |
|-------------|-----|------|
| ComputerName | string | SQL Server コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全なインスタンス名 |
| Type | string | オブジェクトタイプ |
| Owner | string | オブジェクト所有者 |
| Name | string | オブジェクト名 |
| Parent | string | 親コンテナ名 |

## 表示項目

### Type プロパティの値

| 値 | 説明 |
|----|------|
| Database | データベース |
| Agent Job | SQL Agent ジョブ |
| Credential | 資格情報 |
| Proxy | プロキシアカウント |
| Agent Step | エージェントジョブステップ |
| Endpoint | エンドポイント |
| Server Role | サーバーロール |
| Schema | スキーマ |
| Database Role | データベースロール |
| Database Assembly | アセンブリ |
| Database Synonyms | シノニム |

## イベント仕様

### 1-コマンド実行

1. SqlInstance パラメータで指定されたインスタンスに接続
2. Pattern パラメータの正規表現パターンを正規化（バックスラッシュのエスケープ処理）
3. サーバーレベルオブジェクトの検索:
   - データベース所有権
   - SQL Agent ジョブ所有権
   - 資格情報
   - プロキシアカウント
   - エンドポイント
   - サーバーロール
4. データベースレベルオブジェクトの検索:
   - スキーマ
   - データベースロール
   - アセンブリ
   - シノニム
5. 結果をパイプラインに即時出力

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| オブジェクト検索 | sys.databases | SELECT | データベース所有者の取得 |
| オブジェクト検索 | msdb.dbo.sysjobs | SELECT | ジョブ所有者の取得 |

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

このコマンドは読み取り専用であり、データベースの更新は行いません。SMO オブジェクトモデルを使用してメタデータを取得します。

## メッセージ仕様

| 種別 | メッセージ | 条件 |
|------|----------|------|
| Verbose | "Too few slashes, adding extra as required by regex" | Pattern にドメインアカウントが含まれる場合 |
| Verbose | "Gathering data on instance objects" | インスタンスオブジェクト収集開始時 |
| Verbose | "Gather data on Agent Jobs ownership" | ジョブ所有権収集時 |
| Verbose | "checking if $db is owned" | データベース所有権チェック時 |
| Verbose | "Gather user owned object in database: $db" | データベース内オブジェクト収集時 |
| Error | "Failure" | 接続エラー時 |

## 例外処理

| 例外条件 | 処理内容 |
|---------|---------|
| 接続失敗 | Stop-Function で警告を表示し、次のインスタンスへ続行 |
| データベースアクセス不可 | IsAccessible チェックで除外 |

## 備考

- Pattern パラメータは正規表現として処理される
- ドメインアカウント（DOMAIN\user 形式）は自動的にバックスラッシュがエスケープされる
- システムオブジェクト（IsSystemObject = $true）は除外される
- 特定のシステムスキーマ（DatabaseMailUserRole、db_ssisadmin 等）は除外される
- Pattern 未指定時は sa/dbo 以外の全所有オブジェクトを検索

---

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

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

### 推奨読解順序

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

出力される PSCustomObject の構造を理解することが重要です。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Find-DbaUserObject.ps1 | `public/Find-DbaUserObject.ps1` | 行128-136, 155-163 等: 出力オブジェクト構造 |

**読解のコツ**: 各オブジェクトタイプ（Database、Agent Job 等）ごとに PSCustomObject が出力される構造を確認する。

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

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

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

**主要処理フロー**:
1. **行86-91**: begin ブロック - Pattern パラメータの正規表現処理
2. **行93-98**: インスタンスへの接続
3. **行100-121**: サーバーレベルオブジェクト収集（Pattern有無で分岐）
4. **行123-262**: 各オブジェクトタイプの所有権検索
5. **行264-342**: データベース内オブジェクトの検索

#### Step 3: オブジェクトタイプ別処理を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Find-DbaUserObject.ps1 | `public/Find-DbaUserObject.ps1` | 行123-150: データベース所有権 |
| 3-2 | Find-DbaUserObject.ps1 | `public/Find-DbaUserObject.ps1` | 行152-177: Agent ジョブ所有権 |
| 3-3 | Find-DbaUserObject.ps1 | `public/Find-DbaUserObject.ps1` | 行179-220: 資格情報・プロキシ |
| 3-4 | Find-DbaUserObject.ps1 | `public/Find-DbaUserObject.ps1` | 行265-342: データベース内オブジェクト |

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

```
Find-DbaUserObject
    │
    ├─ Connect-DbaInstance (行94)
    │      └─ SQL Server SMO 接続
    │
    ├─ Get-SaLoginName (行100)
    │      └─ sa ログイン名の取得
    │
    ├─ サーバーレベルオブジェクト検索
    │      ├─ $server.Credentials
    │      ├─ $server.JobServer.ProxyAccounts
    │      ├─ $server.Endpoints
    │      ├─ $server.Databases
    │      ├─ $server.JobServer.Jobs
    │      └─ $server.Roles
    │
    └─ データベースレベルオブジェクト検索
           ├─ $db.Schemas
           ├─ $db.Roles
           ├─ $db.Assemblies
           └─ $db.Synonyms
```

### データフロー図

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

SqlInstance ───────────▶ Connect-DbaInstance ───────────▶ Server Object
                               │
Pattern ──────────────────────▶ 正規表現マッチング ─────────▶ フィルタ条件
                               │
                         各オブジェクトコレクション取得
                               │
                         Where-Object によるフィルタ
                               │
                         PSCustomObject 生成 ──────────────▶ Pipeline Output
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Find-DbaUserObject.ps1 | `public/Find-DbaUserObject.ps1` | ソース | メインコマンド実装 |
| Connect-DbaInstance.ps1 | `public/Connect-DbaInstance.ps1` | ソース | SQL Server 接続処理 |
