У меня есть таблица с двумя столбцами.Каждый из них является внешним ключом для той же второй таблицы:
CREATE TABLE [dbo].[TBL_TOGETHER]
(
[ID1] [int] NULL FOREIGN KEY REFERENCES [TBL_ANOTHER_TABLE](ID),
[ID2] [int] NULL FOREIGN KEY REFERENCES [TBL_ANOTHER_TABLE](ID)
)
Но теперь я больше не могу удалять объекты из TBL_ANOTHER_TABLE
:
Оператор DELETE конфликтует сСсылочное ограничение "FK__TBL_ASD__4DE98D56".
Мой вопрос: какое лучшее решение для реализации ON DELETE CASCADE
при TBL_TOGETHER
?
Я пытался добавить ON DELETE SET NULL
или ON DELETE CASCADE
на внешнем ключе, но он не работает из-за циклических или множественных каскадных путей.
Я попытался добавить триггер удаления на TBL_ANOTEHR_TABLE
, но он все еще конфликтует с внешним ключом:
ALTER TRIGGER REMOVE_FORENGKEY
ON TBL_ANOTHER_TABLE
FOR DELETE
AS
BEGIN
UPDATE TBL_TOGETHER
SET TBL_TOGETHER.ID1 = NULL
FROM TBL_TOGETHER
JOIN deleted ON TBL_TOGETHER.ID1 = deleted.ID;
UPDATE TBL_TOGETHER
SET TBL_TOGETHER.ID2 = NULL
FROM TBL_TOGETHER
JOIN deleted ON TBL_TOGETHER.ID2 = deleted.ID;
END
Я пробовал INSTEAD OF DELETE
-триггер, но этот подход также не работает, поскольку ссылочная таблица ALSO содержит внешний ключ с каскадными ограничениями.
ALTER TRIGGER REMOVE_FORENGKEY
ON TBL_ANOTHER_TABLE
INSTEAD OF DELETE
AS
BEGIN
UPDATE TBL_TOGETHER
SET TBL_TOGETHER.ID1 = NULL
FROM TBL_TOGETHER
JOIN deleted ON TBL_TOGETHER.ID1 = deleted.ID;
UPDATE TBL_TOGETHER
SET TBL_TOGETHER.ID2 = NULL
FROM TBL_TOGETHER
JOIN deleted ON TBL_TOGETHER.ID2 = deleted.ID;
DELETE TBL_ANOTHER_TABLE
FROM TBL_ANOTHER_TABLE
JOIN deleted ON TBL_ANOTHER_TABLE.ID = deleted.ID
WHERE TBL_ANOTHER_TABLE.ID = deleted.ID;
END
Ошибка:
Невозможно изменить INSTEAD OF DELETE или INSTEAD UPDATE TRIGGER 'REMOVE_FORENGKEY' в таблице 'TBL_ANOTHER_TABLE'.Это связано с тем, что в таблице есть ИНОСТРАННЫЙ КЛЮЧ с каскадным удалением или обновлением.