# 画面設計書：46-シノニム管理

## 1. 基本情報

| 項目 | 内容 |
|------|------|
| 画面ID | 46 |
| 画面名 | シノニム管理 |
| カテゴリ | Database |
| 対応コマンド | Get-DbaDbSynonym, New-DbaDbSynonym, Remove-DbaDbSynonym |
| 主テンプレートファイル | public/Get-DbaDbSynonym.ps1 |
| 説明 | SQL Serverデータベースのシノニム（エイリアス）の作成・取得・削除機能を提供 |

## 2. 画面概要

シノニム管理画面は、SQL Serverデータベース内のシノニムオブジェクトを管理するためのコマンド群を提供します。シノニムは他のデータベースオブジェクト（テーブル、ビュー、プロシージャ等）への別名であり、クロスデータベース・クロスサーバー参照の簡略化に使用されます。

### 2.1 主要機能

| 機能No | コマンド名 | 機能種別 | 説明 |
|--------|------------|----------|------|
| 663 | Get-DbaDbSynonym | 主機能 | シノニムの取得 |
| 664 | New-DbaDbSynonym | 主機能 | シノニムの作成 |
| 665 | Remove-DbaDbSynonym | 主機能 | シノニムの削除 |

## 3. 機能詳細

### 3.1 Get-DbaDbSynonym

#### 目的
データベースからシノニムオブジェクトとその参照先情報を取得します。

#### パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|--------------|------|
| SqlInstance | DbaInstance[] | No | - | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | - | 代替認証情報 |
| Database | string[] | No | - | 対象データベース |
| ExcludeDatabase | string[] | No | - | 除外するデータベース |
| Schema | string[] | No | - | 対象スキーマ |
| ExcludeSchema | string[] | No | - | 除外スキーマ |
| Synonym | string[] | No | - | 対象シノニム名 |
| ExcludeSynonym | string[] | No | - | 除外シノニム名 |
| InputObject | Database[] | No | - | パイプライン入力用 |
| EnableException | switch | No | - | 例外を有効化 |

#### 出力

| 出力型 | 説明 |
|--------|------|
| Microsoft.SqlServer.Management.Smo.Synonym | SMOシノニムオブジェクト |

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

- ComputerName
- InstanceName
- SqlInstance
- Database
- Schema
- Name
- BaseServer
- BaseDatabase
- BaseSchema
- BaseObject

#### 処理フロー

1. SqlInstance指定時、Get-DbaDatabase経由でデータベースオブジェクト取得
2. 各データベースのSynonymsコレクションを列挙
3. Synonym/ExcludeSynonymでフィルタリング
4. Schema/ExcludeSchemaでフィルタリング
5. カスタムプロパティを追加して出力

### 3.2 New-DbaDbSynonym

#### 目的
データベースに新しいシノニムを作成します。同一データベース、別データベース、リンクサーバー上のオブジェクトへの参照が可能です。

#### パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|--------------|------|
| SqlInstance | DbaInstanceParameter[] | No | - | 対象インスタンス |
| SqlCredential | PSCredential | No | - | 代替認証情報 |
| Database | string[] | No | - | 対象データベース |
| ExcludeDatabase | string[] | No | - | 除外データベース |
| Synonym | string | No | - | シノニム名 |
| Schema | string | No | dbo | シノニムのスキーマ |
| BaseServer | string | No | - | 参照先サーバー（リンクサーバー） |
| BaseDatabase | string | No | - | 参照先データベース |
| BaseSchema | string | No | - | 参照先スキーマ |
| BaseObject | string | Yes | - | 参照先オブジェクト名 |
| InputObject | Database[] | No | - | パイプライン入力 |
| EnableException | switch | No | - | 例外を有効化 |

#### 出力

| 出力型 | 説明 |
|--------|------|
| Microsoft.SqlServer.Management.Smo.Synonym | 作成されたシノニムオブジェクト |

#### 処理フロー

1. パラメータ検証（BaseObject必須、BaseServer使用時はBaseDatabase必須等）
2. Get-DbaDatabase経由またはInputObjectからデータベース取得
3. シノニム名の重複チェック
4. SMO Synonymオブジェクト作成、プロパティ設定
5. Create()メソッドでシノニム作成
6. カスタムプロパティを追加して出力

### 3.3 Remove-DbaDbSynonym

#### 目的
データベースからシノニムを削除します。

#### パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|--------------|------|
| SqlInstance | DbaInstance[] | No | - | 対象インスタンス |
| SqlCredential | PSCredential | No | - | 代替認証情報 |
| Database | string[] | No | - | 対象データベース |
| ExcludeDatabase | string[] | No | - | 除外データベース |
| Schema | string[] | No | - | 対象スキーマ |
| ExcludeSchema | string[] | No | - | 除外スキーマ |
| Synonym | string[] | No | - | 削除対象シノニム名 |
| ExcludeSynonym | string[] | No | - | 除外シノニム名 |
| InputObject | object[] | No | - | パイプライン入力 |
| EnableException | switch | No | - | 例外を有効化 |

#### 出力

| プロパティ | 型 | 説明 |
|-----------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全インスタンス名 |
| Database | string | データベース名 |
| Synonym | string | シノニム名 |
| Status | string | "Removed" または エラーメッセージ |

#### 処理フロー

1. InputObjectの型判定（DbaInstanceParameter/Server/Database/Synonym）
2. 型に応じてGet-DbaDbSynonymでシノニム取得
3. ShouldProcess確認後、DROP SYNONYM SQLを実行
4. 成功/失敗結果をPSCustomObjectで出力

## 4. UI/UX仕様

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

```powershell
# 基本的なシノニム取得
Get-DbaDbSynonym -SqlInstance localhost

# 特定データベースのシノニム取得
Get-DbaDbSynonym -SqlInstance localhost -Database db1

# 特定シノニムの取得
Get-DbaDbSynonym -SqlInstance localhost -Database db1 -Synonym 'synonym1'

# シノニムの作成（同一データベース内）
New-DbaDbSynonym -SqlInstance sql2017a -Database db1 -Synonym synObj1 -BaseObject Obj1

# シノニムの作成（別スキーマ）
New-DbaDbSynonym -SqlInstance sql2017a -Database db1 -Schema sch1 -Synonym synObj1 -BaseObject Obj1 -BaseSchema bSch2

# シノニムの作成（別データベース）
New-DbaDbSynonym -SqlInstance sql2017a -Database db1 -Synonym synObj1 -BaseObject Obj1 -BaseSchema bSch2 -BaseDatabase bDb3

# シノニムの作成（リンクサーバー経由）
New-DbaDbSynonym -SqlInstance sql2017a -Database db1 -Synonym synObj1 -BaseObject Obj1 -BaseSchema bSch2 -BaseDatabase bDb3 -BaseServer bSrv4

# シノニムの削除
Remove-DbaDbSynonym -SqlInstance localhost -Database db1 -Synonym "synonym1", "synonym2"

# パイプラインでの削除
Get-DbaDbSynonym -SqlInstance localhost -Database db1 | Remove-DbaDbSynonym
```

### 4.2 出力例

```
ComputerName InstanceName SqlInstance Database Schema Name      BaseServer BaseDatabase BaseSchema BaseObject
------------ ------------ ----------- -------- ------ ----      ---------- ------------ ---------- ----------
SERVER1      MSSQLSERVER  SERVER1     db1      dbo    syn_Orders            db2          dbo        Orders
SERVER1      MSSQLSERVER  SERVER1     db1      dbo    syn_Remote LinkedSrv  RemoteDB     sales      Products
```

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

### 5.1 エラーケース

| エラー条件 | 対処方法 | 出力 |
|-----------|----------|------|
| データベースアクセス不可 | Continue | 次のデータベースへ |
| シノニム重複 | Stop-Function、Continue | エラーメッセージ |
| BaseObject未指定 | Stop-Function | エラーメッセージ |
| BaseServer指定時BaseDatabase未指定 | Stop-Function | エラーメッセージ |
| BaseDatabase指定時BaseSchema未指定 | Stop-Function | エラーメッセージ |
| DROP失敗 | Stop-Function、Continue | エラーメッセージ |

### 5.2 ConfirmImpact

| コマンド | ConfirmImpact | 説明 |
|----------|---------------|------|
| Get-DbaDbSynonym | Low | SupportsShouldProcess有効だが低影響 |
| New-DbaDbSynonym | Medium | 確認プロンプト表示可能 |
| Remove-DbaDbSynonym | High | 確認プロンプト表示 |

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

### 6.1 必要権限

| 操作 | 必要権限 |
|------|----------|
| シノニム取得 | SELECT権限（sys.synonyms） |
| シノニム作成 | CREATE SYNONYM権限 |
| シノニム削除 | ALTER SCHEMA権限またはDROP SYNONYM権限 |

### 6.2 リンクサーバー

- BaseServer指定時、リンクサーバーが事前に設定されている必要がある
- リンクサーバー経由のシノニムは接続先の権限も必要

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

### 7.1 シノニムコレクション

- Database.Synonymsコレクションは軽量
- 通常、データベースあたりのシノニム数は少ない

### 7.2 削除時のDROP SYNONYM

- Remove-DbaDbSynonymはDROP SYNONYM SQLを直接実行
- SMOのDrop()メソッドではなくQuery()メソッドを使用
- 列挙中のコレクション変更問題を回避

## 8. 関連コマンド

| コマンド | 関連性 |
|----------|--------|
| Get-DbaDatabase | データベースオブジェクト取得 |
| Get-DbaDbTable | シノニム参照先になり得るオブジェクト |
| Get-DbaDbView | シノニム参照先になり得るオブジェクト |
| Get-DbaLinkedServer | リンクサーバー情報取得 |

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

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

| ファイルパス | 行数 | 役割 |
|-------------|------|------|
| public/Get-DbaDbSynonym.ps1 | 176 | シノニム取得コマンド |
| public/New-DbaDbSynonym.ps1 | 231 | シノニム作成コマンド |
| public/Remove-DbaDbSynonym.ps1 | 182 | シノニム削除コマンド |

### 9.2 データ構造

```
Microsoft.SqlServer.Management.Smo.Synonym
├── Name: シノニム名
├── Schema: シノニムのスキーマ
├── BaseServer: 参照先サーバー（リンクサーバー名）
├── BaseDatabase: 参照先データベース
├── BaseSchema: 参照先スキーマ
├── BaseObject: 参照先オブジェクト名
└── Parent: Database

シノニム参照の形式:
[BaseServer].[BaseDatabase].[BaseSchema].[BaseObject]
```

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

```
Get-DbaDbSynonym
├── Get-DbaDatabase (行138)
│   └── Connect-DbaInstance
├── Database.Synonyms (行148) - シノニムコレクション
├── Synonym/Schema フィルタ (行150-164)
├── Add-Member (行167-170) - カスタムプロパティ追加
└── Select-DefaultView (行172) - 出力整形

New-DbaDbSynonym
├── パラメータ検証 (行167-180)
├── Get-DbaDatabase (行184)
├── シノニム重複チェック (行197-199)
├── New-Object Synonym (行205)
├── プロパティ設定 (行206-214)
├── Create() (行215) - SMO作成メソッド
├── Add-Member (行217-220) - カスタムプロパティ追加
└── Select-DefaultView (行222) - 出力整形

Remove-DbaDbSynonym
├── InputObject型判定 (行133-154)
├── Get-DbaDbSynonym (行136, 140, 144)
├── ShouldProcess (行160) - 確認プロンプト
└── Query("DROP SYNONYM") (行164) - SQL実行
```

### 9.4 データフロー図

```
[SQL Server Instance]
        │
        ▼
   [Connect-DbaInstance]
        │
        ▼
   [Get-DbaDatabase]
        │
        ▼
   ┌─────────────────────┐
   │  Database.Synonyms  │
   │  コレクション       │
   └─────────────────────┘
        │
        ├──────────────────────────────────┐
        │                                  │
        ▼                                  ▼
   [Get-DbaDbSynonym]                [New-DbaDbSynonym]
   シノニム取得                      シノニム作成
        │                                  │
        ▼                                  ▼
   [Remove-DbaDbSynonym]        [新規Synonymオブジェクト]
   DROP SYNONYM実行              Create()実行
```

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

1. **参照先パラメータの依存関係**: BaseServer使用時はBaseDatabaseが必須、BaseDatabase使用時はBaseSchemaが必須
2. **リンクサーバー**: BaseServer指定時、リンクサーバーが事前に設定されている必要がある
3. **Schemaデフォルト値**: New-DbaDbSynonymのSchemaデフォルト値は"dbo"
4. **削除方法**: Remove-DbaDbSynonymはSMOのDrop()ではなくDROP SYNONYM SQLを使用
5. **InputObject型**: Remove-DbaDbSynonymは複数の型を受け入れ（DbaInstanceParameter/Server/Database/Synonym）

## 11. 改訂履歴

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