«удаление строки из одной таблицы вызовет запуск более 1200 триггеров»
Эти операторы или триггеры уровня строки?
Если последнее, они будут срабатывать только при удалении строки. Скажем, у вас есть триггер BEFORE DELETE для клиентов, чтобы удалить заказы клиентов, и триггер BEFORE DELETE для заказов, чтобы удалить позиции заказа. Если у клиента нет заказов, а триггер таблицы заказов является триггером уровня строки, он не будет запускать удаление из позиций заказа.
"проверить наличие связанной строки перед попыткой удаления"
Наверное, нет пользы. На самом деле это сделало бы больше работы, имея SELECT, а затем DELETE.
Конечно, логика гибернации нарушена. Сеанс удаления будет видеть только (и пытаться удалить) зафиксированные транзакции. Если FRED вставил заказ для клиента, но он не зафиксирован, удаление JOHN (через триггер) не увидит его и не попытается удалить. Однако он все равно будет «успешным» и попытается удалить родительского клиента.
Если вы действительно включили ограничения внешнего ключа в базе данных, Oracle сработает. Он будет ожидать фиксации FRED, а затем отклонит удаление, поскольку у него есть дочерний элемент.
Если ограничения внешнего ключа отсутствуют, у вас есть заказ для несуществующего клиента. Вот почему вы должны применять подобную бизнес-логику в базе данных.