sql >> データベース >  >> RDS >> Sqlserver

削除時にカスケードしますか、それともトリガーを使用しますか?

    カスケード削除 MSSQL Serverでは、単一のテーブルにのみカスケードできます。ディメンションテーブルに対して外部キー関係を持つ2つのテーブルがある場合、カスケード削除をカスケードできるのはそのうちの1つだけです。 (これは、削除が複数のパスを介してカスケードされ、競合が発生するのを防ぐためです。C++では多重継承が許可されていますが、C#では単一の継承のみが許可されています)

    この場合、トリガーを使用するか、コードでケースを具体的に処理する必要があります。

    このため、多くの人がすべての場合にトリガーを使用することを選択するのを見てきました。外国のテーブルが1つしかない場合でも。これにより一貫性が確保されるため、データベースを保守するときに何を探すべきかがわかります。

    削除を複数のテーブルにカスケードできる場合は、それが最も望ましいオプションだと思います。ただし、この制限により水が濁り、私は現在、そのようなすべての動作を所有するトリガーを支持しています。カスケードされた削除と更新にトリガーを使用する際のオーバーヘッドは、コーディングの観点からはごくわずかですが、真に一般的な標準的な方法を可能にします。

    編集:

    「受け入れられた答え」を他の誰かに移したいと思うかもしれません。私は上記のことで間違っていたことがわかりました。

    複数のファクトテーブルに、署名ディメンションテーブルへのONDELETECASCADE外部キー制約を設定できます。

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

    たとえば...
    -ディメンションテーブル[Person](id INT IDENTITY、)
    -ディメンションテーブル[Exam](id INT IDENTITY、)
    -フェイステーブル[Exam_Score](person_id INT、exam_id INT、スコアINT)

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

    これは、MSSQLServerでONDELETECASCADEを使用することはできないため、トリガーが必要です。

    (これを私に説明しようとしたMehrdadに謝罪しましたが、私は彼の主張を完全に見逃しました。)



    1. 送信された日付がデータベースの2つの日付の間にあることを確認するにはどうすればよいですか?

    2. MySQLのUNIONALLとLIMIT

    3. 複数のページでApexフォームを作成する

    4. 重複するキー値が一意の制約に違反しています-daskデータフレームからSQLテーブルを作成しようとしたときのpostgresエラー