次のテーブル定義:
CREATE TABLE Customers( id INT NOT NULL PRIMARY KEY, name [varchar](50) )
CREATE TABLE Orders ( id INT NOT NULL PRIMARY KEY,
customer INT FOREIGN KEY
REFERENCES Customers(id) ON DELETE CASCADE )
CREATE TABLE OrderDetails ( id INT NOT NULL PRIMARY KEY,
order INT FOREIGN KEY REFERENCES Orders(id) ON DELETE CASCADE,
customer INT FOREIGN KEY REFERENCES Customers(id) ON DELETE CASCADE )
複数のカスケード パスがあるため、SQL サーバーでは使用できません。
ON DELETE CASCADE
on 列を指定せずに OrderDetails を作成order
して、以下を含むトリガーで注文を削除するときに参照整合性を強制できるかどうかを見てみましょう。
DELETE FROM OrderDetails
FROM Deleted d
INNER JOIN OrderDetails od
ON od.order = d.id
Orders での削除の後にトリガーが起動するため、実行できません (DELETE ステートメントが REFERENCE 制約と競合しました)。
問題はモデルの設計にあり、OrderDetails から Customers への参照は設計が悪いと思います。ただし、それ以外の場合は、異なる顧客に属する注文の OrderDetails を作成することができます。
2 つの質問:
- 最適なモデル設計は?
- それにもかかわらず、トリガーを使用することは可能ですか?
編集: OrderDetails から Customers への参照を削除しましたが、意味がありません。これにより、すべての問題が解決されます。