Допустим, у меня есть 4 таблицы, A, B, C, D.Перекрытие внешних ключей и каскада при удалении
A имеет первичный ключ ID.
B имеет первичный ключ (ID, A.ID), где A.ID является внешним ключом с CASCADE ON DELETE.
C имеет первичный ключ (ID, A.ID), где A.ID является внешним ключом с CASCADE ON DELETE.
D имеет первичный ключ (ID, A.ID, B.ID, C.ID), с (A.ID, B.ID) и (A.ID, C.ID) - внешние ключи.
Есть ли способ КАСКАДА ПО УДАЛЕНИЮ для обоих внешних ключей D? Пытаться каскадом для обоих внешних ключей дает мне «несколько каскадных путей» для сбоев как для внешних ключей, так и для каскадных удалений A.ID, но мне нужно удалить строку из D, если строка B.ID или C.ID будет удалена.
EDIT:
Столы DeviceTypes, DeviceInstances, DeviceDataElements, DeviceDataRecords
DeviceTypes имеет первичный ключ ID.
Устройства DeviceInstances имеет первичный ключ (ID, DeviceTypes.ID) с DeviceTypes.ID, являющийся внешним ключом с CASCADE ON DELETE.
У DeviceDataElements есть первичный ключ (ID, DeviceTypes.ID) с DeviceTypes.ID, являющийся внешним ключом с CASCADE ON DELETE.
D имеет первичный ключ (ID, Devices.ID, DeviceElements.ID, DeviceInstances.ID), с (DeviceTypes.ID, DeviceElements.ID) и (DeviceTypes.ID, DeviceInstances.ID), являющимися внешними ключами.
i.E DeviceRecord содержит точку данных для DeviceDataElement определенного DeviceInstance.
звучит беспорядочно для меня, можете ли вы предоставить некоторые простые данные и сценарии, чтобы прояснить структуру таблицы. – Tanner
Вместо каскадных удалений напишите хранимую процедуру, которая опускает ссылочные строки в транзакции в правильном порядке. Чтобы принудительно использовать эту процедуру, вы можете отказать в правах DELETE для всех, кроме хранимой процедуры. – Andomar
@Tanner Дала все имена, чтобы придать ситуации еще больший контекст. – Mike