Я видел разные посты о том, как реализовать удаление зависимых строк из других таблиц с помощью CASCADE DELETE или различных способов создания или поиска зависимостей и создания динамического SQL.
Я не в восторге от идеи использования CASCADE delete, если только по причинам, связанным с чрезмерным заголовком, из-за того, что CASCADE выдает так много DELETE для записей, которые имеют многочисленные зависимости, которые имеют свои собственные многочисленные зависимости (не упомянуть тот факт, что результаты могут быть трудно отследить и не все, что хорошо подходит для производственных сред).
Итак, смирившись с тем, что написал их тем или иным способом, мне интересно, каков компромисс с размещением всех необходимых удалений в хранимой процедуре или триггере удаления.
Мне нравится опция триггера DELETE, потому что она сохраняет семантику удаления прямо. То есть:
DELETE FROM [SomeTable] WHERE [SomeColumn] = VAL
Позаботится обо всем удалении, о котором нужно позаботиться, и ни один разработчик не может ошибиться, не вызвав процедуру удаления:
EXECUTE [prc_SomeTable_Delete] VAL
Тем не менее, меня беспокоит использование TRIGGER, поскольку мне кажется, что я вижу довольно много «экспертных» рекомендаций против их [частого] использования.
С моей точки зрения, фактическая реализация TRIGGER по сравнению с хранимой процедурой кажется почти идентичной. Таким образом, при условии, что мы применяем последовательную практику, кажется, что решение TRIGGER должно работать нормально.
Существует ли лучшая [или самая распространенная] практика, которой следует следовать? Какими должны быть мои опасения в краткосрочной и долгосрочной перспективе? По большей части эти удаления будут производиться из клиентского приложения .NET - скорее всего, полагаясь на Entity Framework для доступа к данным и манипулирования ими; как это должно повлиять на мое решение?
Не стесняйтесь размещать ссылки на исчерпывающие соображения по этой теме, поскольку мои усилия еще не дали никаких результатов.
Спасибо всем.