Программисты Оракла чешут в затылке - "а что, можно как то по другому?" :)
Триггер - вызывается базой данных автоматически по событию - добавление, удаление записи, изменение записи. Используется для обеспечения целостности БД, программирования реакции на событие - например при добавлении платежа абоненту автоматически пересчитать ему баланс и разрешить доступ в интернет (база биллинга оператора), или при добавлении платежа автоматически насчитать бонусные балы.
Процедура - вызывается извне БД программистом, часто выглядит как обращение к таблице или что то похожее. Например ежесуточный расчет потребленного трафика всеми абонентами можно оформить в виде процедуры.
Таким образом принципиальная разница - кто вызывает на исполнение - сама БД (триггер), или программист извне (процедура). Никто не мешает написать процедуру, которая при добавлении платежа будет рассчитывать бонусы, пересчитывать баланс абонента, разрешать\запрещать доступ в инет, а из триггера на добавление\изменение\удаление записей таблицы вызывать эту процедуру. Таким образом можно сэкономить код - написать его один раз. В последующем сопровождать эту БД будет проще.
Реализовать логику приложения на триггерах\прооцедурах - в принципе это правильный подход, когда все детали обработки данных собраны в одном месте, во многих случаях это упростит работу с этой базой. Например, в случае того же биллинга - достаточно просто добавить запись платежа в базу и все необходимые действия будут выполнены. Т.е. упрощается разработка веб интерфейса биллинга - не надо на уровне приложения отслеживать зависимости между таблицами, пересчитывать зависимые поля и т.п.
В крупных серверах БД поддержка триггеров и процедур есть, яркий пример тот же оракл. Для написания процедур есть свой язык, позволяющий реализовать почти все. А может и все - я не ораклист. В mysql триггера и процедуры появились относительно недавно, и разработчики, работающие с ним - просто привыкли все реализовывать на стороне приложения.