# 画面設計書：47-外部キー・制約

## 1. 基本情報

| 項目 | 内容 |
|------|------|
| 画面ID | 47 |
| 画面名 | 外部キー・制約 |
| カテゴリ | Database |
| 対応コマンド | Get-DbaDbForeignKey, Get-DbaDbCheckConstraint, Remove-DbaDbCheckConstraint |
| 主テンプレートファイル | public/Get-DbaDbForeignKey.ps1 |
| 説明 | SQL Serverデータベースの外部キー制約とチェック制約の取得・削除機能を提供 |

## 2. 画面概要

外部キー・制約画面は、SQL Serverデータベース内の参照整合性制約（外部キー）およびデータ検証制約（チェック制約）を管理するためのコマンド群を提供します。制約のメタデータ取得と不要なチェック制約の削除機能を含みます。

### 2.1 主要機能

| 機能No | コマンド名 | 機能種別 | 説明 |
|--------|------------|----------|------|
| 104 | Get-DbaDbForeignKey | 主機能 | 外部キー制約の取得 |
| 100 | Get-DbaDbCheckConstraint | 補助機能 | チェック制約の取得 |
| 205 | Remove-DbaDbCheckConstraint | 補助機能 | チェック制約の削除 |

## 3. 機能詳細

### 3.1 Get-DbaDbForeignKey

#### 目的
データベーステーブルの外部キー制約とその参照関係を取得します。テーブル間の依存関係分析やマイグレーション計画に有用です。

#### パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|--------------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | - | 対象SQL Serverインスタンス |
| SqlCredential | PSCredential | No | - | 代替認証情報 |
| Database | object[] | No | - | 対象データベース |
| ExcludeDatabase | object[] | No | - | 除外するデータベース |
| ExcludeSystemTable | switch | No | - | システムテーブルを除外 |
| EnableException | switch | No | - | 例外を有効化 |

#### 出力

| 出力型 | 説明 |
|--------|------|
| Microsoft.SqlServer.Management.Smo.ForeignKey | SMO外部キーオブジェクト |

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

- ComputerName
- InstanceName
- SqlInstance
- Database
- Schema
- Table
- ID
- CreateDate
- DateLastModified
- Name
- IsEnabled
- IsChecked
- NotForReplication
- ReferencedKey
- ReferencedTable
- ReferencedTableSchema

#### 処理フロー

1. Connect-DbaInstanceでサーバー接続
2. IsAccessibleなデータベースをフィルタリング
3. 各データベースのテーブルを列挙
4. ExcludeSystemTable指定時、IsSystemObject = falseのテーブルのみ
5. 各テーブルのForeignKeysコレクションを列挙
6. カスタムプロパティ（Schema, Table等）を追加して出力

### 3.2 Get-DbaDbCheckConstraint

#### 目的
データベーステーブルのチェック制約（データ検証ルール）を取得します。

#### パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|--------------|------|
| SqlInstance | DbaInstanceParameter[] | Yes | - | 対象インスタンス |
| SqlCredential | PSCredential | No | - | 代替認証情報 |
| Database | object[] | No | - | 対象データベース |
| ExcludeDatabase | object[] | No | - | 除外データベース |
| ExcludeSystemTable | switch | No | - | システムテーブルを除外 |
| EnableException | switch | No | - | 例外を有効化 |

#### 出力

| 出力型 | 説明 |
|--------|------|
| Microsoft.SqlServer.Management.Smo.Check | SMOチェック制約オブジェクト |

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

- ComputerName
- InstanceName
- SqlInstance
- Database
- Parent（テーブル）
- ID
- CreateDate
- DateLastModified
- Name
- IsEnabled
- IsChecked
- NotForReplication
- Text
- State

#### 処理フロー

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

### 3.3 Remove-DbaDbCheckConstraint

#### 目的
データベーステーブルからチェック制約を削除します。

#### パラメータ

| パラメータ名 | 型 | 必須 | デフォルト値 | 説明 |
|-------------|-----|------|--------------|------|
| SqlInstance | DbaInstanceParameter[] | No | - | 対象インスタンス |
| SqlCredential | PSCredential | No | - | 代替認証情報 |
| Database | object[] | No | - | 対象データベース |
| ExcludeDatabase | object[] | No | - | 除外データベース |
| ExcludeSystemTable | switch | No | - | システムテーブルを除外 |
| InputObject | Check[] | Yes(Pipeline) | - | パイプライン入力 |
| EnableException | switch | No | - | 例外を有効化 |

#### 出力

| プロパティ | 型 | 説明 |
|-----------|-----|------|
| ComputerName | string | コンピュータ名 |
| InstanceName | string | インスタンス名 |
| SqlInstance | string | 完全インスタンス名 |
| Database | string | データベース名 |
| Name | string | 制約名 |
| Status | string | "Dropped" または エラーメッセージ |
| IsRemoved | bool | 削除成功フラグ |

#### 処理フロー

1. beginブロックで空の配列を初期化
2. processブロックでGet-DbaDbCheckConstraint経由またはInputObjectから制約収集
3. endブロックで実際のDrop()実行（コレクション変更問題回避）
4. ShouldProcess確認後、Drop()メソッド呼び出し
5. 成功/失敗結果をPSCustomObjectで出力

## 4. UI/UX仕様

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

```powershell
# 全外部キーの取得
Get-DbaDbForeignKey -SqlInstance sql2016

# 特定データベースの外部キー取得
Get-DbaDbForeignKey -SqlInstance Server1 -Database db1

# システムテーブルを除外した外部キー取得
Get-DbaDbForeignKey -SqlInstance Server1 -ExcludeSystemTable

# 全チェック制約の取得
Get-DbaDbCheckConstraint -SqlInstance sql2016

# 特定データベースのチェック制約取得
Get-DbaDbCheckConstraint -SqlInstance Server1 -Database db1

# チェック制約の削除
Remove-DbaDbCheckConstraint -SqlInstance localhost -Database db1

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

# システムテーブル除外で削除
Remove-DbaDbCheckConstraint -SqlInstance localhost -Database db1 -ExcludeSystemTable

# パイプラインでのインスタンス入力
'Sql1','Sql2/sqlexpress' | Get-DbaDbForeignKey
```

### 4.2 出力例

```
# Get-DbaDbForeignKey
ComputerName InstanceName SqlInstance Database Schema Table      ID    Name                  IsEnabled ReferencedTable ReferencedTableSchema
------------ ------------ ----------- -------- ------ -----      --    ----                  --------- --------------- ---------------------
SERVER1      MSSQLSERVER  SERVER1     db1      dbo    Orders     12345 FK_Orders_Customers   True      Customers       dbo
SERVER1      MSSQLSERVER  SERVER1     db1      dbo    OrderItems 12346 FK_OrderItems_Orders  True      Orders          dbo

# Get-DbaDbCheckConstraint
ComputerName InstanceName SqlInstance Database Parent      Name           IsEnabled Text
------------ ------------ ----------- -------- ------      ----           --------- ----
SERVER1      MSSQLSERVER  SERVER1     db1      dbo.Orders  CK_Status      True      ([Status] IN ('Pending','Complete'))
SERVER1      MSSQLSERVER  SERVER1     db1      dbo.Orders  CK_Total       True      ([Total] >= 0)
```

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

### 5.1 エラーケース

| エラー条件 | 対処方法 | 出力 |
|-----------|----------|------|
| データベースアクセス不可 | Write-Message Warning、スキップ | 警告メッセージ |
| 外部キーなし | Write-Message Verbose | Verboseメッセージ |
| チェック制約なし | Write-Message Verbose | Verboseメッセージ |
| Drop失敗（依存関係等） | Stop-Function、Status=エラーメッセージ | IsRemoved=false |
| 接続失敗 | Stop-Function、Continue | エラーメッセージ |

### 5.2 ConfirmImpact

| コマンド | ConfirmImpact | 説明 |
|----------|---------------|------|
| Get-DbaDbForeignKey | なし | 参照のみ |
| Get-DbaDbCheckConstraint | なし | 参照のみ |
| Remove-DbaDbCheckConstraint | High | 確認プロンプト表示 |

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

### 6.1 必要権限

| 操作 | 必要権限 |
|------|----------|
| 外部キー取得 | VIEW DEFINITION権限 |
| チェック制約取得 | VIEW DEFINITION権限 |
| チェック制約削除 | ALTER TABLE権限 |

### 6.2 システムテーブルの保護

- ExcludeSystemTableを使用してシステムテーブルの制約を除外推奨
- システムテーブルの制約変更は予期しない動作を引き起こす可能性

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

### 7.1 テーブル列挙

- 全テーブルを列挙してから制約を取得
- 大規模データベースでは時間がかかる可能性

### 7.2 システムテーブル除外

- ExcludeSystemTableでフィルタリング可能
- システムテーブルが多い場合、パフォーマンス向上

### 7.3 制約ごとの出力

- 各外部キー/チェック制約を個別のオブジェクトとして出力
- パイプライン処理に最適化

## 8. 関連コマンド

| コマンド | 関連性 |
|----------|--------|
| Get-DbaDatabase | データベースオブジェクト取得 |
| Get-DbaDbTable | テーブル管理 |
| Get-DbaDbIndex | インデックス管理（類似機能） |

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

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

| ファイルパス | 行数 | 役割 |
|-------------|------|------|
| public/Get-DbaDbForeignKey.ps1 | 173 | 外部キー取得コマンド |
| public/Get-DbaDbCheckConstraint.ps1 | 161 | チェック制約取得コマンド |
| public/Remove-DbaDbCheckConstraint.ps1 | 146 | チェック制約削除コマンド |

### 9.2 データ構造

```
Microsoft.SqlServer.Management.Smo.ForeignKey
├── Name: 外部キー名
├── ID: オブジェクトID
├── CreateDate: 作成日
├── DateLastModified: 最終更新日
├── IsEnabled: 有効/無効
├── IsChecked: チェック済みフラグ
├── NotForReplication: レプリケーション除外フラグ
├── ReferencedKey: 参照先キー名
├── ReferencedTable: 参照先テーブル名
├── ReferencedTableSchema: 参照先スキーマ
├── DeleteAction: 削除時アクション
├── UpdateAction: 更新時アクション
├── Columns: 外部キー列コレクション
└── Parent: Table

Microsoft.SqlServer.Management.Smo.Check
├── Name: 制約名
├── ID: オブジェクトID
├── CreateDate: 作成日
├── DateLastModified: 最終更新日
├── IsEnabled: 有効/無効
├── IsChecked: チェック済みフラグ
├── NotForReplication: レプリケーション除外フラグ
├── Text: 制約定義式
├── State: SMO状態
└── Parent: Table
```

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

```
Get-DbaDbForeignKey
├── Connect-DbaInstance (行127)
├── Database.Tables (行147) - テーブルコレクション
├── ExcludeSystemTableフィルタ (行148-149)
├── Table.ForeignKeys (行152) - 外部キーコレクション
├── Add-Member (行158-163) - カスタムプロパティ追加
└── Select-DefaultView (行165-166) - 出力整形

Get-DbaDbCheckConstraint
├── Connect-DbaInstance (行116)
├── Database.Tables (行136) - テーブルコレクション
├── ExcludeSystemTableフィルタ (行137-138)
├── Table.Checks (行141) - チェック制約コレクション
├── Add-Member (行147-151) - カスタムプロパティ追加
└── Select-DefaultView (行153-154) - 出力整形

Remove-DbaDbCheckConstraint
├── Get-DbaDbCheckConstraint (行114) - 制約取得
├── ShouldProcess (行123) - 確認プロンプト
├── Check.Drop() (行134) - SMO削除メソッド
└── Get-ErrorMessage (行139) - エラー処理
```

### 9.4 データフロー図

```
[SQL Server Instance]
        │
        ▼
   [Connect-DbaInstance]
        │
        ▼
   [Get-DbaDatabase]
        │
        ▼
   ┌─────────────────────┐
   │  Database.Tables    │
   │  テーブルコレクション│
   └─────────────────────┘
        │
        ├── ExcludeSystemTableフィルタ
        │
        ├─────────────────────────────────┐
        │                                 │
        ▼                                 ▼
[Table.ForeignKeys]              [Table.Checks]
 外部キーコレクション             チェック制約コレクション
        │                                 │
        ▼                                 ▼
[Get-DbaDbForeignKey]       [Get-DbaDbCheckConstraint]
        │                                 │
        │                                 ▼
        │                    [Remove-DbaDbCheckConstraint]
        │                        Drop()実行
        ▼
  [参照関係の可視化]
```

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

1. **外部キー削除機能なし**: 現在、外部キー削除専用のコマンドは提供されていない
2. **カスケード操作**: 外部キーのDeleteAction/UpdateActionプロパティで確認可能
3. **チェック制約式**: Textプロパティに制約の検証式が含まれる
4. **システムテーブル**: ExcludeSystemTableを使用しないとシステムテーブルの制約も含まれる
5. **参照整合性**: 外部キーで参照されているデータの削除時はDeleteActionに注意

## 11. 改訂履歴

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