# 画面設計書：48-アセンブリ管理

## 1. 基本情報

| 項目 | 内容 |
|------|------|
| 画面ID | 48 |
| 画面名 | アセンブリ管理 |
| カテゴリ | Database |
| 対応コマンド | Get-DbaDbAssembly, Copy-DbaDbAssembly |
| 主テンプレートファイル | public/Get-DbaDbAssembly.ps1 |
| 説明 | SQL ServerデータベースのCLRアセンブリの取得・コピー機能を提供 |

## 2. 画面概要

アセンブリ管理画面は、SQL Serverデータベースに登録されたCLR（Common Language Runtime）アセンブリを管理するためのコマンド群を提供します。セキュリティ監査、インベントリ管理、サーバー間のアセンブリ移行に使用されます。

### 2.1 主要機能

| 機能No | コマンド名 | 機能種別 | 説明 |
|--------|------------|----------|------|
| 99 | Get-DbaDbAssembly | 主機能 | CLRアセンブリの取得 |
| 359 | Copy-DbaDbAssembly | 補助機能 | CLRアセンブリのコピー |

## 3. 機能詳細

### 3.1 Get-DbaDbAssembly

#### 目的
データベースに登録されたCLRアセンブリとそのメタデータ（セキュリティレベル、バージョン、所有者等）を取得します。

#### パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|--------------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | - | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | - | 代替認証情報 |
| Database | string[] | No | - | 対象データベース |
| Name | string[] | No | - | 対象アセンブリ名 |
| EnableException | switch | No | - | 例外を有効化 |

#### 出力

| 出力型 | 説明 |
|--------|------|
| Microsoft.SqlServer.Management.Smo.Assembly | SMOアセンブリオブジェクト |

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

- ComputerName
- InstanceName
- SqlInstance
- Database
- ID
- Name
- Owner
- AssemblySecurityLevel as SecurityLevel
- CreateDate
- IsSystemObject
- Version

#### 処理フロー

1. Connect-DbaInstanceでサーバー接続
2. IsAccessibleなデータベースをフィルタリング
3. Database指定時、対象データベースのみ
4. 各データベースのAssembliesコレクションを列挙
5. Name指定時、対象アセンブリのみフィルタ
6. カスタムプロパティを追加して出力

### 3.2 Copy-DbaDbAssembly

#### 目的
ソースサーバーのデータベースからCLRアセンブリを宛先サーバーにコピー（移行）します。

#### パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|--------------|------|
| Source | DbaInstanceParameter | Yes | - | ソースインスタンス |
| SourceSqlCredential | PSCredential | No | - | ソース認証情報 |
| Destination | DbaInstanceParameter[] | Yes | - | 宛先インスタンス |
| DestinationSqlCredential | PSCredential | No | - | 宛先認証情報 |
| Assembly | object[] | No | - | 対象アセンブリ（DatabaseName.AssemblyName形式） |
| ExcludeAssembly | object[] | No | - | 除外アセンブリ |
| Force | switch | No | - | 既存アセンブリを上書き |
| EnableException | switch | No | - | 例外を有効化 |

#### 出力

| プロパティ | 型 | 説明 |
|-----------|-----|------|
| DateTime | DateTime | 処理日時 |
| SourceServer | string | ソースサーバー名 |
| SourceDatabase | string | ソースデータベース |
| SourceDatabaseID | int | ソースデータベースID |
| DestinationServer | string | 宛先サーバー名 |
| DestinationDatabase | string | 宛先データベース |
| DestinationDatabaseID | int | 宛先データベースID |
| Type | string | "Database Assembly" |
| Name | string | アセンブリ名 |
| Status | string | Successful/Skipped/Failed |
| Notes | string | スキップ/失敗理由 |

#### 処理フロー

1. ソースサーバーに接続（MinimumVersion 9 = SQL Server 2005）
2. 全データベースからユーザー作成アセンブリを収集
3. 各宛先サーバーに接続
4. 宛先データベースの存在確認
5. External権限アセンブリの場合、TRUSTWORTHY設定
6. 既存アセンブリの確認（Force指定時は削除）
7. アセンブリのScript()でDDL生成、実行
8. 結果をPSCustomObjectで出力

## 4. UI/UX仕様

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

```powershell
# 全アセンブリの取得
Get-DbaDbAssembly -SqlInstance localhost

# 複数インスタンスからの取得
Get-DbaDbAssembly -SqlInstance localhost, sql2016

# 特定データベース・アセンブリの取得
Get-DbaDbAssembly -SqlInstance Server1 -Database MyDb -Name MyTechCo.Houids.SQLCLR

# アセンブリのコピー
Copy-DbaDbAssembly -Source sqlserver2014a -Destination sqlcluster

# 特定アセンブリのコピー
Copy-DbaDbAssembly -Source sqlserver2014a -Destination sqlcluster -Assembly dbname.assemblyname, dbname3.anotherassembly

# 強制上書きコピー
Copy-DbaDbAssembly -Source sqlserver2014a -Destination sqlcluster -Force

# WhatIf確認
Copy-DbaDbAssembly -Source sqlserver2014a -Destination sqlcluster -WhatIf -Force
```

### 4.2 出力例

```
# Get-DbaDbAssembly
ComputerName InstanceName SqlInstance Database ID   Name                     Owner SecurityLevel CreateDate          IsSystemObject Version
------------ ------------ ----------- -------- --   ----                     ----- ------------- ----------          -------------- -------
SERVER1      MSSQLSERVER  SERVER1     db1      123  MyTechCo.Houids.SQLCLR   dbo   Safe          2024-01-15 10:30:00 False          1.0.0.0
SERVER1      MSSQLSERVER  SERVER1     db1      124  CustomFunctions          dbo   External      2024-01-20 09:15:00 False          2.1.0.0

# Copy-DbaDbAssembly
DateTime            SourceServer DestinationServer Name                     Type              Status     Notes
--------            ------------ ----------------- ----                     ----              ------     -----
2024-02-18 12:00:00 Server1      Server2           MyTechCo.Houids.SQLCLR   Database Assembly Successful
2024-02-18 12:00:01 Server1      Server2           CustomFunctions          Database Assembly Skipped    Already exists on destination
```

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

### 5.1 エラーケース

| エラー条件 | 対処方法 | 出力 |
|-----------|----------|------|
| 接続失敗 | Stop-Function、Continue | エラーメッセージ |
| 宛先データベースなし | Status=Skipped | Notes="Destination database does not exist" |
| アセンブリ既存（Force未指定） | Status=Skipped | Notes="Already exists on destination" |
| 依存関係あり（Force指定時） | Status=Failed | Notes=エラーメッセージ |
| アセンブリ作成失敗 | Status=Failed | Notes=エラーメッセージ |
| TRUSTWORTHY設定失敗 | Status=Failed | Notes=エラーメッセージ |

### 5.2 ConfirmImpact

| コマンド | ConfirmImpact | 説明 |
|----------|---------------|------|
| Get-DbaDbAssembly | なし | 参照のみ |
| Copy-DbaDbAssembly | Medium | SupportsShouldProcess有効 |

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

### 6.1 必要権限

| 操作 | 必要権限 |
|------|----------|
| アセンブリ取得 | VIEW DEFINITION権限 |
| アセンブリコピー | sysadmin権限（ソース・宛先両方） |
| TRUSTWORTHY設定 | ALTER DATABASE権限 |

### 6.2 アセンブリセキュリティレベル

| レベル | 説明 |
|--------|------|
| Safe | CLRコード内のみ実行、外部リソースアクセス不可 |
| External | ファイル、ネットワーク等の外部リソースアクセス可能 |
| Unsafe | 制限なし、アンマネージドコード実行可能 |

### 6.3 TRUSTWORTHY設定

- External/Unsafeアセンブリには`TRUSTWORTHY ON`が必要
- Copy-DbaDbAssemblyは自動的にTRUSTWORTHYを設定

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

### 7.1 システムアセンブリの除外

- IsSystemObject = falseのアセンブリのみがコピー対象
- システムアセンブリは自動的に除外

### 7.2 アセンブリScript()

- SMOのScript()メソッドでDDL生成
- バイナリデータを含むため、大きなアセンブリは時間がかかる可能性

### 7.3 依存関係

- アセンブリに依存関係がある場合、Force指定でも削除失敗
- 依存オブジェクト（CLRプロシージャ等）は自動移行されない

## 8. 関連コマンド

| コマンド | 関連性 |
|----------|--------|
| Get-DbaDatabase | データベースオブジェクト取得 |
| Get-DbaDbStoredProcedure | CLRプロシージャ取得 |
| Get-DbaDbUdf | CLR関数取得 |

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

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

| ファイルパス | 行数 | 役割 |
|-------------|------|------|
| public/Get-DbaDbAssembly.ps1 | 128 | アセンブリ取得コマンド |
| public/Copy-DbaDbAssembly.ps1 | 267 | アセンブリコピーコマンド |

### 9.2 データ構造

```
Microsoft.SqlServer.Management.Smo.SqlAssembly
├── Name: アセンブリ名
├── ID: オブジェクトID
├── Owner: 所有者
├── AssemblySecurityLevel: セキュリティレベル
│   ├── Safe
│   ├── External
│   └── Unsafe
├── CreateDate: 作成日
├── IsSystemObject: システムオブジェクトフラグ
├── Version: バージョン情報
└── Parent: Database

アセンブリ指定形式（Copy時）:
"DatabaseName.AssemblyName"
```

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

```
Get-DbaDbAssembly
├── Connect-DbaInstance (行98)
├── Database.Assemblies (行108) - アセンブリコレクション
├── Nameフィルタ (行109-111)
├── Add-Member (行114-118) - カスタムプロパティ追加
└── Select-DefaultView (行120) - 出力整形

Copy-DbaDbAssembly
├── Connect-DbaInstance -MinimumVersion 9 (行118) - SQL 2005以上
├── sourceAssemblies収集 (行123-137)
│   └── IsSystemObject = false フィルタ (行129)
├── Connect-DbaInstance (行145) - 宛先接続
├── TRUSTWORTHY設定 (行198-212)
│   └── ALTER DATABASE SET TRUSTWORTHY ON
├── 既存チェック・削除 (行215-244)
│   └── DROP ASSEMBLY SQL
├── Script()生成 (行249)
└── Query()実行 (行251) - アセンブリ作成
```

### 9.4 データフロー図

```
[Source SQL Server]
        │
        ▼
   [Connect-DbaInstance]
   MinimumVersion 9
        │
        ▼
   ┌─────────────────────────┐
   │  全Database.Assemblies  │
   │  (IsSystemObject=false) │
   └─────────────────────────┘
        │
        │ Assembly/ExcludeAssemblyフィルタ
        │ ("DatabaseName.AssemblyName"形式)
        ▼
   [sourceAssemblies]
        │
        ├── 各宛先サーバーへ
        │
        ▼
   [Destination SQL Server]
        │
        ├── データベース存在確認
        │
        ├── External: TRUSTWORTHY設定
        │
        ├── 既存確認（Force時は削除）
        │
        ▼
   [Script() → Query()]
   アセンブリ作成SQL実行
        │
        ▼
   [MigrationObject出力]
   Status: Successful/Skipped/Failed
```

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

1. **MinimumVersion**: Copy-DbaDbAssemblyはSQL Server 2005以上が必要
2. **依存オブジェクト**: CLRプロシージャ、関数、型などの依存オブジェクトは自動移行されない
3. **依存関係エラー**: 依存関係があるアセンブリはForce指定でも削除できない
4. **TRUSTWORTHY**: External/Unsafeアセンブリは自動的にTRUSTWORTHY設定される
5. **アセンブリ指定形式**: "DatabaseName.AssemblyName"形式で指定
6. **システムアセンブリ**: システムアセンブリはコピー対象外

## 11. 改訂履歴

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