2009-09-21 5 views
11

私は引き継いだプロジェクトを進行しています。データベース側では、以前のプログラマーが子レコードを削除するためのトリガーを書いていることに気付きました。つまり、これらのレコードにはすでに削除している親レコードとの外部キー関係があります。削除トリガーは、子レコードの単純な削除ステートメントにすぎません。削除をカスケードするか、トリガーを使用しますか?

トリガーを作成して子レコードを削除するとメリットはありますか、削除するとカスケードするように変更できますか?

私はMSSQL 2008を使用しています。

答えて

15

MSSQL ServerのCASCADE DELETEは、1つのテーブルにのみカスケードできます。ディメンション表との外部キー関係を持つ2つの表がある場合は、それらのいずれかにカスケードすることしかできません。 (これは、複数のパスをカスケードしてコンフリクトを作成するのを防ぐためです.C++では複数の継承が可能ですが、C#では1つの継承しかできません)。コード。

私は多くの人がすべてのケースでトリガーを使用することを選択したことがわかりました。外国のテーブルが1つだけの場合でも。これにより一貫性が保証され、データベースをメンテナンスするときに何を探すべきかが分かります。

複数のテーブルに削除をカスケードすることができれば、私はそれが最も好ましいオプションだと言います。しかし、この制限は水を混乱させるものであり、私は現在、このような行動をすべて持っているトリガーにもっと賛成しています。カスケードされた削除と更新のトリガーを使用する際のオーバーヘッドは、コーディングの点ではごくわずかですが、本当に一般的な標準的な方法が可能です。

EDIT:あなたが他の誰かに「受け入れ答え」を移動する場合があります

、私は上記のABOT間違っていたうちに働いてきました。

signleディメンションテーブルに対するON DELETE CASCADEの外部キー制約を複数のファクトテーブルに持たせることができます。

できないことは、ファクトテーブルに複数のディメンションテーブルに対するON DELETE CASCADEの外部キー制約があることです。

したがって、たとえば...
- 寸法表[人](IDのINT同一性)
- 寸法表[試験](IDのINT同一性)
- フェイス表[Exam_Score(PERSON_ID INT、exam_id INT、スコアINT)

個人または試験のいずれかが削除されている場合は、関連するExam_Scoreレコードも削除する必要があります。

これは、MS SQL ServerでON DELETE CASCADEを使用することができないため、トリガーが必要です。

(私にこれを説明しようとしたが、私は完全に彼のポイントを逃したMehrdadに謝罪。)

+0

正確な理由は、彼らがトリガーを置く理由と似ています –

+0

+1 - 私はこの状況について考えなかった。 –

10

不要なトリガーから遠ざかります。

ON DELETE CASCADEとすればいいです。

+0

これらは必ずしも必要ではありません。たとえば、複数の外部表をカスケードすることはできません。 – MatBailie

+0

私は彼らが不必要だと言っていませんでした。それがあなたの問題に合っているならば、 'ON DELET CASCADE'を使うべきだと言った(私はOPの状況が' CASCADEによって満足されていると思う)。ところで、「複数の外国のテーブルに」というのはどういう意味ですか?「ON DELETE CASCADE」も階層的に機能していると思います。ただし、単一の表からの直接参照と間接参照の両方をサポートしていません。 –

+0

いいえ、MS SQL Serverでは、主キーまたは一意制約を複数のテーブルにカスケードする削除を許可していません。それを設定してみて、エラーメッセージが表示されます。カスケード削除は、1次元テーブルから1ファクトテーブルまでしか機能しません。 1次元表から多数のファクト表までは機能しません。 – MatBailie

1

私は削除時にカスケードを使用しますが、親が削除された場合は必ず削除してください。

条件ロジックがある場合(私は日曜日に削除された場合のみ子を削除します)、トリガーを使用します。

開発システムでcascade on deleteに変更するだけで、単体テストを実行して何も壊れないことを確認します。

1

私は(そのことについてとON UPDATE CASCADEON DELETE CASCADEを使用する以外、私はほとんどここ民主党員に同意参照動作可能な限りのみ必要に応じてトリガーを使用します。私はまた、テーブルからのパーミッションを取り消し、削除と更新のために保存された 'ヘルパー'の使用を強制することも考えています。

私は楽観的ですが、私のコードはMS SQL Serverの将来のリリースに移植され、b)SQL Serverチームはすぐに「1カスケードパス」の制限を修正することになりますどの時点でトリガをカスケード参照アクションに置き換えますか?

関連する問題