Причина, по которой мы запрещаем использование каскадного удаления, связана с производительностью и блокировкой. Да, это не так плохо, когда вы удаляете одну запись, но рано или поздно вам придется удалить большую группу записей, и ваша база данных остановится.
Если вы удаляете достаточно записей, SQL Server может перерасти в блокировку таблицы, и никто не сможет ничего сделать с таблицей, пока она не будет завершена.
Недавно мы переместили одного из наших клиентов на его собственный сервер. В рамках сделки нам также пришлось удалить все записи этого клиента с нашего исходного сервера. Удаление всей его информации в пакетном режиме (чтобы не вызывать проблем у других пользователей) заняло пару месяцев. Если бы мы настроили каскадное удаление, база данных была бы недоступна для других клиентов в течение длительного времени, так как миллионы записей были удалены за одну транзакцию, и сотни таблиц были заблокированы, пока транзакция не была выполнена.
Я также мог бы увидеть сценарий, в котором могла бы возникнуть тупик при использовании каскадного удаления, потому что мы не контролируем порядок, в котором должен был бы идти каскадный путь, и наша база данных несколько денормализована с появлением клиентуры в большинстве таблиц. Таким образом, если он заблокировал одну таблицу с внешним ключом и для третьей таблицы, а также таблицу клиентов, которая находилась по другому пути, он, возможно, не смог бы проверить эту таблицу, чтобы удалить ее из третьей таблицы, потому что это все одна транзакция и блокировки не будут сняты, пока это не будет сделано. Поэтому, возможно, он не позволил бы нам устанавливать каскадные удаления, если бы видел возможность создания тупиковых ситуаций в транзакции.
Другая причина избежать каскадного удаления заключается в том, что иногда наличие дочерней записи является достаточной причиной, чтобы не удалять родительскую запись. Например, если у вас есть таблица клиентов, и у этого клиента были заказы в прошлом, вы не захотите удалить его и потерять информацию о фактическом заказе.