# 画面設計書 70-ユーザーエクスポート

## 概要

本ドキュメントは、dbatools PowerShell モジュールにおけるデータベースユーザーエクスポート機能の設計仕様を定義する。データベースユーザーをロール、権限を含む完全なセキュリティコンテキストと共に T-SQL スクリプトとして出力する。

### 本画面の処理概要

本機能は、データベースユーザーを再作成するための包括的な T-SQL スクリプトを生成する。ユーザー作成ステートメント、ロールメンバーシップ、データベースレベル権限（CONNECT、SELECT、INSERT 等）、およびテーブル、ビュー、ストアドプロシージャ、関数などのオブジェクトレベル権限を含む。

**業務上の目的・背景**：DBA は環境間でのユーザー移行、コンプライアンス監査のためのセキュリティ構成ドキュメント化、アプリケーションユーザーのデプロイメントスクリプト作成、災害復旧手順の準備のために本機能を使用する。生成されるスクリプトは自己完結型で、依存関係の問題を避けるために必要なロール作成ステートメントを含む。

**画面へのアクセス方法**：PowerShell コンソールから `Export-DbaUser` コマンドを直接呼び出す。Get-DbaDatabase からパイプラインで渡すことも可能。

**主要な操作・処理内容**：
1. `Export-DbaUser` - ユーザーを T-SQL スクリプトとしてエクスポート
2. User パラメータで特定ユーザーのみエクスポート
3. Template パラメータでプレースホルダー付きスクリプト生成
4. DestinationVersion で対象 SQL Server バージョンの構文を生成
5. Passthru でコンソールに出力、またはファイルに保存

**画面遷移**：
- Get-DbaDatabase → Export-DbaUser のパイプライン連携
- Export-DbaUser → ファイル出力

**権限による表示制御**：データベースへの読み取り権限が必要。SQL Server 2000 以上が必要。

## 関連機能

| 機能No | 機能名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| - | Export-DbaUser | 主機能 | ユーザーの T-SQL エクスポート |
| - | Get-DbaDatabase | 補助機能 | データベース取得（パイプライン入力） |

## 画面種別

CLI（コマンドラインインターフェース）/ スクリプト生成

## URL/ルーティング

PowerShell コマンドレットとして呼び出し。URL は存在しない。

```powershell
Export-DbaUser -SqlInstance <インスタンス名> -FilePath C:\temp\users.sql
Export-DbaUser -SqlInstance <インスタンス名> -User User1, User2 -FilePath C:\temp\users.sql
Export-DbaUser -SqlInstance <インスタンス名> -Database db1 -User user1 -Template -PassThru
```

## 入出力項目

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 |
|-------------|---|------|------|
| SqlInstance | DbaInstanceParameter[] | No | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | 認証情報 |
| Database | string[] | No | 対象データベース（ワイルドカード可） |
| ExcludeDatabase | string[] | No | 除外データベース（ワイルドカード可） |
| User | string[] | No | 対象ユーザー名 |
| DestinationVersion | string | No | 対象バージョン（SQLServer2000-2022） |
| Encoding | string | No | ファイルエンコーディング（デフォルト UTF8） |
| Path | string | No | 出力ディレクトリ |
| FilePath | string | No | 出力ファイルパス |
| InputObject | Microsoft.SqlServer.Management.Smo.Database[] | No | パイプライン入力用データベースオブジェクト |
| NoClobber | switch | No | 既存ファイル上書き禁止 |
| Append | switch | No | ファイルに追記 |
| Passthru | switch | No | コンソールに出力 |
| Template | switch | No | プレースホルダー付きスクリプト生成 |
| ScriptingOptionsObject | ScriptingOptions | No | カスタムスクリプティングオプション |
| ExcludeGoBatchSeparator | switch | No | GO バッチ区切りを除外 |
| WhatIf | switch | No | 実行せずに動作を表示 |
| Confirm | switch | No | 実行前に確認 |
| EnableException | switch | No | 例外処理を有効化 |

## 表示項目

### Export-DbaUser 出力

**Passthru 指定時**: System.String（T-SQL スクリプト）

**デフォルト**: System.IO.FileInfo（生成されたファイル情報）

### 生成される T-SQL スクリプトの構成

1. USE [database] ステートメント
2. カスタムロール作成（IF NOT EXISTS）
3. ユーザー作成（CREATE USER）
4. ロールメンバーシップ（sp_addrolemember）
5. データベースレベル権限（GRANT/DENY/REVOKE）
6. オブジェクトレベル権限（テーブル、ビュー、SP 等）

## イベント仕様

### 1-Export-DbaUser 実行

1. Test-ExportDirectory で出力ディレクトリ確認
2. バージョンマッピング定義（SQLServer2000-2022 → Version80-160）
3. Get-DbaDatabase でデータベース取得
4. ScriptingOptionsObject 設定（未指定時は自動作成）
5. 各ユーザーについて：
   - 所属するカスタムロールをスクリプト出力
   - $dbuser.Script() でユーザー作成スクリプト生成
   - Template 指定時は {templateUser}/{templateLogin} に置換
   - EnumDatabasePermissions でデータベース権限取得
   - EnumObjectPermissions で各オブジェクト権限取得
6. GO バッチ区切りで結合（ExcludeGoBatchSeparator 時は除外）
7. ファイル出力または Passthru でコンソール出力

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

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

| 操作（イベント） | 対象テーブル | 操作種別 | 概要 |
|----------------|-------------|---------|------|
| Export-DbaUser | $db.Users, $db.Roles, 各オブジェクト | SELECT | ユーザー・権限情報読み取り |

## メッセージ仕様

| メッセージID | 種別 | メッセージ内容 | 発生条件 |
|-------------|------|---------------|----------|
| - | エラー | "This user may be using functionality from ... that does not exist on the destination version" | バージョン互換性エラー |
| - | Verbose | "Validating users on database $db" | データベース処理開始 |

## 例外処理

| 例外条件 | ハンドリング | ユーザーへのフィードバック |
|---------|-------------|-------------------------|
| バージョン互換性エラー | Stop-Function -Continue | バージョン不一致の詳細 |

## 備考

- SQL Server 2000 以上が必要
- DestinationVersion で対象バージョンの構文を生成（SQLServer2000-2022）
- デフォルトエンコーディングは UTF8
- Template オプションで {templateUser}, {templateLogin} プレースホルダーに置換
- 各ユーザーのスクリプトは自己完結型（ロール作成を含む）
- 多数のオブジェクトタイプの権限を列挙（Assembly、Certificate、Schema、Service Broker 等）
- AsymmetricKeys は SQL Server 2000 ではスキップ

---

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

### 推奨読解順序

#### Step 1: バージョンマッピングと ScriptingOptions

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Export-DbaUser.ps1 | `public/Export-DbaUser.ps1` | 行 195-217: バージョンマッピング定義 |
| 1-2 | Export-DbaUser.ps1 | `public/Export-DbaUser.ps1` | 行 243-251: ScriptingOptionsObject 設定 |

**主要処理フロー**:
- **行 195-205**: $versions ハッシュテーブル（SQLServer2000 → Version80 等）
- **行 207-217**: $versionName ハッシュテーブル（逆引き用）

#### Step 2: ロールとユーザーのスクリプト生成

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 2-1 | Export-DbaUser.ps1 | `public/Export-DbaUser.ps1` | 行 355-363: カスタムロールのスクリプト出力 |
| 2-2 | Export-DbaUser.ps1 | `public/Export-DbaUser.ps1` | 行 365-385: ユーザースクリプト生成と Template 処理 |

#### Step 3: 権限列挙

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Export-DbaUser.ps1 | `public/Export-DbaUser.ps1` | 行 387-403: データベース権限 |
| 3-2 | Export-DbaUser.ps1 | `public/Export-DbaUser.ps1` | 行 413-477: オブジェクト権限の列挙 |
| 3-3 | Export-DbaUser.ps1 | `public/Export-DbaUser.ps1` | 行 479-563: オブジェクト権限の GRANT 構築 |

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

```
Export-DbaUser
    |
    +-- begin ブロック
    |       |
    |       +-- Test-ExportDirectory
    |       +-- バージョンマッピング定義
    |
    +-- process ブロック
            |
            +-- Get-DbaDatabase
            |
            +-- foreach ($db)
                    |
                    +-- ScriptingOptionsObject 設定
                    |
                    +-- foreach ($dbuser)
                            |
                            +-- ロールスクリプト生成
                            |       |
                            |       +-- $role.Script()
                            |
                            +-- ユーザースクリプト生成
                            |       |
                            |       +-- $dbuser.Script()
                            |       +-- (Template) プレースホルダー置換
                            |
                            +-- データベース権限
                            |       |
                            |       +-- $db.EnumDatabasePermissions()
                            |
                            +-- オブジェクト権限
                            |       |
                            |       +-- $db.EnumObjectPermissions()
                            |       +-- $item.EnumObjectPermissions() (各オブジェクトタイプ)
                            |
                            +-- 出力
                                    |
                                    +-- (Passthru) $sql
                                    +-- (else) Out-File
```

### データフロー図

```
[入力: SqlInstance/Database/User/InputObject]
           |
           v
    +----------------+
    | Get-DbaDatabase|
    +----------------+
           |
           v
    +-------------------+
    | ScriptingOptions  |
    | 設定              |
    +-------------------+
           |
           v
    +-------------------+
    | foreach ($dbuser) |
    +-------------------+
           |
           +--> ロール列挙 → $role.Script()
           |
           +--> $dbuser.Script() → (Template) 置換
           |
           +--> EnumDatabasePermissions()
           |
           +--> EnumObjectPermissions() × 各オブジェクト
           |
           v
    +-------------------+
    | SQL 結合          |
    | (GO 区切り)       |
    +-------------------+
           |
           v
[出力: T-SQL スクリプト (File/Console)]
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Export-DbaUser.ps1 | `public/Export-DbaUser.ps1` | ソース | ユーザーエクスポート |
| Get-DbaDatabase.ps1 | `public/Get-DbaDatabase.ps1` | ソース | データベース取得（内部使用） |
| New-DbaScriptingOption.ps1 | `public/New-DbaScriptingOption.ps1` | ソース | スクリプティングオプション作成 |
