Два внешних ключа на одной таблице: как реализовать каскад удаления? - PullRequest
4 голосов
/ 14 мая 2019

У меня есть таблица с двумя столбцами.Каждый из них является внешним ключом для той же второй таблицы:

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'.Это связано с тем, что в таблице есть ИНОСТРАННЫЙ КЛЮЧ с каскадным удалением или обновлением.

...