Что лучше триггер или процедура? И почему не запихнуть бы всю логику в процедуры?

Что лучше триггер или процедура? И почему не запихнуть бы всю логику в процедуры?
  • Вопрос задан
  • 1099 просмотров
Пригласить эксперта
Ответы на вопрос 8
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
Что лучше триггер или процедура?
В процедуру не передаются таблицы inserted и deleted, они требуют явного вызова. А в триггерах запрещены некоторые операции.
И почему не запихнуть бы всю логику в процедуры?
Можно, некоторые так и делают: проще поддерживать (DBA никакого отношения к программированию процедур не имеет — администратор); в общем случае, процедуры лучше кэшируются и пр.
Ответ написан
alexey-m-ukolov
@alexey-m-ukolov Куратор тега MySQL
Что лучше триггер или процедура?
Каждой задаче свой инструмент, каждому инструменту свою задачу.

И почему не запихнуть бы всю логику в процедуры?
  • Не всё можно сделать процедурами.
  • Не всё оптимально делать процедурами.
  • Процедуры может быть сложнее поддерживать - время DBA обычно дороже, чем время разработчика. Да и требования к уровню гораздо ниже в случае логики в коде - поменять какой-то несложный алгоритм можно доверить и джуниору, а вот менять схему БД его вряд ли пустят.
  • Изменение процедур в некоторых СУБД может надолго залочить всю БД.
Ответ написан
dimonchik2013
@dimonchik2013
non progredi est regredi
триггеры / процедуры чреваты сюрпрайзами при репликациях,
в общем-то, поэтому их и не рекомендуют использовать вообще

они есть для того, чтобы можно было что-то необходимое сделать (проверки там, транзакции и проч по принципу черного ящика), но в общем случае БД должна оставаться БД - надежным хранилищем упорядоченных данных с прогнозируемым временем доступа
Ответ написан
Комментировать
martin74ua
@martin74ua Куратор тега MySQL
Linux administrator
Программисты Оракла чешут в затылке - "а что, можно как то по другому?" :)

Триггер - вызывается базой данных автоматически по событию - добавление, удаление записи, изменение записи. Используется для обеспечения целостности БД, программирования реакции на событие - например при добавлении платежа абоненту автоматически пересчитать ему баланс и разрешить доступ в интернет (база биллинга оператора), или при добавлении платежа автоматически насчитать бонусные балы.

Процедура - вызывается извне БД программистом, часто выглядит как обращение к таблице или что то похожее. Например ежесуточный расчет потребленного трафика всеми абонентами можно оформить в виде процедуры.

Таким образом принципиальная разница - кто вызывает на исполнение - сама БД (триггер), или программист извне (процедура). Никто не мешает написать процедуру, которая при добавлении платежа будет рассчитывать бонусы, пересчитывать баланс абонента, разрешать\запрещать доступ в инет, а из триггера на добавление\изменение\удаление записей таблицы вызывать эту процедуру. Таким образом можно сэкономить код - написать его один раз. В последующем сопровождать эту БД будет проще.

Реализовать логику приложения на триггерах\прооцедурах - в принципе это правильный подход, когда все детали обработки данных собраны в одном месте, во многих случаях это упростит работу с этой базой. Например, в случае того же биллинга - достаточно просто добавить запись платежа в базу и все необходимые действия будут выполнены. Т.е. упрощается разработка веб интерфейса биллинга - не надо на уровне приложения отслеживать зависимости между таблицами, пересчитывать зависимые поля и т.п.

В крупных серверах БД поддержка триггеров и процедур есть, яркий пример тот же оракл. Для написания процедур есть свой язык, позволяющий реализовать почти все. А может и все - я не ораклист. В mysql триггера и процедуры появились относительно недавно, и разработчики, работающие с ним - просто привыкли все реализовывать на стороне приложения.
Ответ написан
@d-stream
Готовые решения - не подаю, но...
Это ровно как с отвертками, молотками, гвоздодерами, напильниками - все они предназначены для разных действий. Иногда конечно получается забивать напильником саморез по металлу в гипсокартон, но он фиговато держится. Что совершенно не значит что гипсокартон - плохой материал или саморезу по металлу - плохи... тем паче нельзя пенять на напильник...

Так же и с триггерами, процедурами и бизнес-логикой на стороне приложения - при уместном и корректном использовании это будут отличные конструкции, иначе - будет кака.

p/s/ и да, триггеры бывают не только DML, но и DDL разных уровней + всяких специфичных видов типа event_driven, logon и т.п.
Ответ написан
Комментировать
@MoonMaster
Программист и этим все сказано
Вопрос в том, что именно вы хотите сделать. Ведь у триггера и процедуры своя технологическая направленность
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Добавлю свои 5 копеек.
В свое время (90 года, раньше не в курсе), открыв любую книгу по проектированию приложений и баз данных вы бы прочитали именно такой рецепт - вся логика в б.д. на процедурах и триггерах, а клиентская часть - по сути только обеспечивает интерфейс с пользователем. Это клиент-серверная архитектура.
Сейчас же, с переходом на веб, архитектура приложения, работающего с БД стала трехзвенной, поэтому стало возможным вынести логику из БД на уровень веб-серевера/сервера приложений. Это ни плохо и ни хорошо. Просто сейчас так модно - БД просто хранилище данных, а логика вся на сервере приложений. Раньше было модно логику держать в БД.
Хотя и раньше никто не препятствовал делать трехзвенку, но она получалась искусственной и нужны были дополнительные доводы, чтоб ее реализовывать. Сейчас же трехзвенку создавать не надо - она уже есть по факту наличия веб-приложения.
Те кто не разрабатывает веб-приложения просто следуют модному течению.
По уму надо сочетать оба подхода, т.к. какие-то операции лучше реализовывать в БД, а какие-то в сервере приложений или в клиентской части.
Ну и вопрос цены, разумеется - хороший DBA (или программист БД) стоит дороже (и это более редкие звери), чем хороший веб-разрабочик.
Ответ написан
saintbyte
@saintbyte
Django developer
Почему никто не предлагает сначала написать процедуры и затем использовать их в триггерах?
Вообще начните с процедур их как-то проще отлаживать , а потом пихайте их уже в триггеры.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы