Следующее определение таблицы:
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, потому что существует несколько каскадных путей.
Я подумал, давайте создадим OrderDetails без ON DELETE CASCADE
в столбце order
и посмотрим, можно ли обеспечить ссылочную целостность при удалении заказа с помощью триггера, содержащего:
DELETE FROM OrderDetails
FROM Deleted d
INNER JOIN OrderDetails od
ON od.order = d.id
Триггер срабатывает после удаления в Orders, поэтому это невозможно (оператор DELETE конфликтует с ограничением REFERENCE).
Я считаю, что проблема заключается в дизайне модели, а ссылка из OrderDetails на Customers — это плохой дизайн. Однако в противном случае можно было бы создать OrderDetails для заказов, принадлежащих разным клиентам.
Два вопроса:
- какой лучший дизайн модели?
- тем не менее можно ли использовать триггер?
РЕДАКТИРОВАТЬ: я удалил ссылку из OrderDetails на Customers, это не имеет никакого смысла. Это решает все вопросы.