Это одно из печальных и откровенно раздражающих ограничений SQL Server.
Проблема не в том, что могут быть циклы, а в том, что, как говорит ошибка, у вас есть несколько каскадных путей к таблице Linker
. Первый - aspnet_Users -> A -> Linker
, а второй - aspnet_Users -> B -> Linker
.
У вас есть только пара вариантов:
Выберите один путь для реализации CASCADE
и установите для другого значение NO ACTION
. Затем напишите хранимую процедуру, которая удаляет некаскадные дочерние объекты перед удалением родительских объектов, чтобы предотвратить ошибку внешнего ключа. Или не CASCADE
, и пусть ваш SP делает каскад для обоих.
Во втором отношении вообще не добавляйте внешний ключ; вместо этого используйте триггер FOR DELETE
на родительском объекте, чтобы удалить дочерние объекты. Мне очень не нравится использовать триггеры для RI, но это не намного хуже, чем первый вариант. В некотором смысле это лучше, потому что клиенты баз данных не должны беспокоиться о вашей конкретной реализации отношений FK.
Ни один из них не идеален, но нет иного идеального решения, кроме как изменить свой дизайн. Если бы вы могли изменить свою схему так, чтобы у вас не было нескольких каскадных путей, это было бы лучше всего сделать, но я признаю, что есть (много) реальных ситуаций, когда это невозможно. Не зная специфики вашей схемы, я не могу точно сказать, существует ли более оптимальный дизайн.