Если для вашей базы данных определен правильный RI, то не должно быть случаев нарушения целостности данных. Все ваши связанные таблицы должны иметь декларативный RI, что означает, что вы не можете удалить родителя, пока у него еще есть дети.
Кроме того, если у вас есть код, который время от времени удаляет только некоторые строки, это плохое кодирование и плохое тестирование. Эти виды действий должны быть одной транзакцией. Ваше предложение использовать хранимую процедуру является отличным подходом для решения этой проблемы и довольно стандартно.
Как уже упоминалось, у каскадных триггеров есть опасность удаления строк, которые кто-то не собирался удалять. Учтите, что иногда люди могут получать доступ к вашим данным откуда-то за пределами вашего приложения, особенно при устранении проблем с данными. Когда кто-то случайно пытается удалить неправильного родителя и получает ошибку RI, это хорошо. Когда они случайно пытаются удалить неправильного родителя, и он не только удаляет этого родителя, но и 20 дочерних элементов в 5 других таблицах, это плохо.
Кроме того, каскадные удаления очень скрыты. Если разработчик кодирует удаление для родителя, он должен знать, что он должен использовать хранимую процедуру удаления, чтобы заботиться о детях. Гораздо предпочтительнее, чтобы разработчик не программировал против этого, получал ошибку и исправлял свой код (или понимал, что он действительно не хочет делать все это удаление), чем для того, чтобы разработчик добавил удаление и никто не понимает, что это убивает детей, пока код не заработал.
ИМО, я предпочитаю, чтобы мои разработчики знали о приложении, а не помогали им оставаться в неведении о нем.