# 機能設計書 205-Remove-DbaDbCheckConstraint

## 概要

本ドキュメントは、dbatools PowerShellモジュールのRemove-DbaDbCheckConstraint関数の機能設計を定義する。この関数は、SQL Serverデータベーステーブルからチェック制約を削除するための機能を提供する。

### 本機能の処理概要

Remove-DbaDbCheckConstraintは、1つ以上のSQL Serverインスタンスにわたるデータベーステーブルからチェック制約を削除する。チェック制約はデータ整合性を強制し、INSERT操作やUPDATE操作の前に列の値が特定の条件を満たしていることを検証する。

**業務上の目的・背景**：テーブルスキーマの変更、古いビジネスルールの削除、または既存の制約がバルク操作をブロックする可能性があるデータ移行の準備において、チェック制約の削除が必要になる。この関数は手動のT-SQLスクリプトなしで制約を削除する機能を提供する。

**機能の利用シーン**：
- テーブルスキーマの変更時に制約を一時的に削除
- 廃止されたビジネスルールに関連する制約の削除
- データ移行前の制約の除去
- 複数インスタンスにわたる制約の一括削除

**主要な処理内容**：
1. SqlInstance指定時はGet-DbaDbCheckConstraintで制約を取得
2. InputObject経由でパイプライン入力を受け入れ
3. システムテーブルの制約を除外（ExcludeSystemTable指定時）
4. ShouldProcess確認後、SMO Drop()メソッドで制約を削除
5. 削除結果をPSCustomObjectとして出力

**関連システム・外部連携**：
- SQL Server SMO (Microsoft.SqlServer.Management.Smo.Check)：チェック制約オブジェクト
- Get-DbaDbCheckConstraint：制約取得の連携コマンド

**権限による制御**：対象テーブルに対するALTER権限が必要。

## 関連画面

| 画面No | 画面名 | 関連種別 | 関連する操作・処理 |
|--------|--------|----------|------------------|
| 47 | 外部キー・制約 | 補助機能 | チェック制約の削除 |

## 機能種別

データ削除（DDL操作）

## 入力仕様

### 入力パラメータ

| パラメータ名 | 型 | 必須 | 説明 | バリデーション |
|-------------|-----|-----|------|---------------|
| SqlInstance | DbaInstanceParameter[] | No | 対象のSQL Serverインスタンス | - |
| SqlCredential | PSCredential | No | SQL Server認証用の資格情報 | - |
| Database | object[] | No | 対象データベース名。ワイルドカード対応 | - |
| ExcludeDatabase | object[] | No | 除外するデータベース名 | - |
| ExcludeSystemTable | switch | No | システムテーブルの制約を除外 | - |
| InputObject | Microsoft.SqlServer.Management.Smo.Check[] | Yes（Pipelineセット時） | パイプラインからの制約オブジェクト | ValueFromPipeline |
| EnableException | switch | No | 例外を直接スローするかどうか | - |

### 入力データソース

- パラメータ入力：SqlInstance、Database
- パイプライン入力：Get-DbaDbCheckConstraintからの制約オブジェクト

## 出力仕様

### 出力データ

| 項目名 | 型 | 説明 |
|--------|-----|------|
| ComputerName | string | SQL Serverが稼働しているコンピュータ名 |
| InstanceName | string | SQL Serverインスタンス名 |
| SqlInstance | string | 完全なSQL Serverインスタンス名 |
| Database | string | データベース名 |
| Name | string | 削除された制約名 |
| Status | string | "Dropped"（成功時）またはエラーメッセージ |
| IsRemoved | bool | 削除成功=true、失敗=false |

### 出力先

- パイプライン：PSCustomObject
- SQL Server：チェック制約の削除

## 処理フロー

### 処理シーケンス

```
1. begin ブロック
   └─ 1.1 空の制約配列を初期化
2. process ブロック
   └─ 2.1 SqlInstance指定時
       └─ Get-DbaDbCheckConstraintで制約を取得
   └─ 2.2 InputObject指定時
       └─ パイプライン入力を配列に追加
3. end ブロック
   └─ 3.1 各制約についてループ処理
       └─ 3.1.1 ShouldProcess確認
       └─ 3.1.2 出力オブジェクト初期化
       └─ 3.1.3 Drop()メソッド実行
       └─ 3.1.4 成功時: Status="Dropped", IsRemoved=true
       └─ 3.1.5 失敗時: Statusにエラー、IsRemoved=false
       └─ 3.1.6 出力オブジェクトをパイプラインに出力
```

### フローチャート

```mermaid
flowchart TD
    A[開始] --> B{SqlInstance指定?}
    B -->|Yes| C[Get-DbaDbCheckConstraint]
    C --> D[制約配列に追加]
    B -->|No| E{InputObject?}
    E -->|Yes| F[パイプライン入力を追加]
    F --> D
    E -->|No| G[終了]
    D --> H{制約ループ}
    H -->|次の制約| I{ShouldProcess?}
    I -->|No| H
    I -->|Yes| J[出力オブジェクト初期化]
    J --> K[Drop実行]
    K --> L{成功?}
    L -->|Yes| M[Status=Dropped]
    L -->|No| N[Status=Error]
    M --> O[出力]
    N --> O
    O --> H
    H -->|完了| G
```

## ビジネスルール

### 業務ルール

| ルールNo | ルール名 | 内容 | 適用条件 |
|---------|---------|------|---------|
| BR-205-01 | 確認プロンプト | ConfirmImpact=Highで実行前に確認を求める | Confirm未指定時 |
| BR-205-02 | システムテーブル除外 | ExcludeSystemTable指定時はシステムテーブルの制約を除外 | ExcludeSystemTable指定時 |
| BR-205-03 | 結果出力 | 成功/失敗に関わらず各制約の結果を出力 | 常時 |
| BR-205-04 | コレクション変更対策 | endブロックで削除処理を実行（パイプライン中のコレクション変更エラーを防止） | 常時 |

### 計算ロジック

特になし

## データベース操作仕様

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

| 操作 | 対象 | 操作種別 | 概要 |
|-----|-----|---------|------|
| 制約削除 | チェック制約 | DDL (DROP CONSTRAINT) | SMO Drop()メソッドによる削除 |

### テーブル別操作詳細

#### 対象テーブル

| 操作 | 項目（カラム名） | 更新値・取得条件 | 備考 |
|-----|-----------------|-----------------|------|
| DROP CONSTRAINT | チェック制約 | $chkcItem.Drop() | SMO経由での削除 |

## エラー処理

### エラーケース一覧

| エラーコード | エラー種別 | 発生条件 | 対処方法 |
|------------|----------|---------|---------|
| DropFailed | 実行エラー | Drop()メソッド失敗 | エラー詳細を確認 |
| ConnectionError | 接続エラー | SQL Serverへの接続失敗 | 接続情報を確認 |

### リトライ仕様

リトライ処理は実装されていない。

## トランザクション仕様

各制約の削除は独立して実行。トランザクション制御は実装されていない。

## パフォーマンス要件

- 単一制約の削除は即時完了
- 大量の制約を削除する場合は処理時間に注意

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

- 対象テーブルへのALTER権限が必要
- ConfirmImpact=Highによる誤操作防止

## 備考

- Mikey Bronowski (@MikeyBronowski) により作成
- Get-DbaDbCheckConstraintとのパイプライン連携が可能

---

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

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

### 推奨読解順序

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

SMOのCheckオブジェクトの構造を理解することが重要。

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 1-1 | Microsoft.SqlServer.Management.Smo.Check | SMO | Check.Parent（テーブル参照）、Check.Name、Drop()メソッド |

**読解のコツ**: CheckオブジェクトのParentはテーブルを指し、Parent.Parentはデータベース、Parent.Parent.Parentはサーバーを指す。

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

Remove-DbaDbCheckConstraint.ps1の構造を理解する。

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

**主要処理フロー**:
1. **105-107行目**: begin ブロック（制約配列初期化）
2. **109-117行目**: process ブロック（制約取得/追加）
3. **120-144行目**: end ブロック（削除処理ループ）
4. **123行目**: ShouldProcess確認
5. **134行目**: Drop()メソッド呼び出し

#### Step 3: 関連機能を理解する

| 順序 | ファイル | パス | 読解ポイント |
|-----|---------|------|-------------|
| 3-1 | Get-DbaDbCheckConstraint.ps1 | `public/Get-DbaDbCheckConstraint.ps1` | 制約取得（パイプライン入力元） |

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

```
Remove-DbaDbCheckConstraint
    │
    ├─ Get-DbaDbCheckConstraint (SqlInstance指定時)
    │      └─ チェック制約オブジェクト取得
    │
    ├─ $chkcItem.Drop()
    │      └─ SMO経由で制約削除
    │
    ├─ Stop-Function
    │      └─ エラー処理
    │
    └─ Get-ErrorMessage
           └─ エラーメッセージ取得
```

### データフロー図

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

SqlInstance ─────────▶ Get-DbaDbCheckConstraint
    │                        │
    │                        ▼
Database ────────────▶ 制約配列に格納
    │                        │
InputObject ─────────▶────────┘
                             │
                             ▼
                    ┌────────────────┐
                    │ end ブロック   │
                    │ 削除処理ループ │
                    └────────────────┘
                             │
                             ▼
                    ShouldProcess確認
                             │
                             ▼
                    Drop()メソッド実行
                             │
            ┌────────────────┼────────────────┐
            ▼                                 ▼
      成功時出力                          失敗時出力
    PSCustomObject                      PSCustomObject
    Status=Dropped                      Status=Error
    IsRemoved=true                      IsRemoved=false
```

### 関連ファイル一覧

| ファイル | パス | 種別 | 役割 |
|---------|------|------|------|
| Remove-DbaDbCheckConstraint.ps1 | `public/Remove-DbaDbCheckConstraint.ps1` | ソース | メイン関数実装 |
| Get-DbaDbCheckConstraint.ps1 | `public/Get-DbaDbCheckConstraint.ps1` | ソース | 制約取得（パイプライン入力元） |
