@esy1993

Как в триггерах ссылаться на таблицы и поля этих таблиц?

Всем привет.

Хочу решить конкретную задачу:

Таблица Долг в поле Сумма содержит значение общего долга контрагента
Таблица Платеж в поле Сумма содержит значение суммы платежа от контрагента

Ломаю голову над тем, как написать триггер, который при вводе данных о платеже, заставит БД пересчитать значение долга с учетом этого платежа. А заодно хочу понять принцип ссылок из триггера на другие таблицы. Помогите профану, пожалста
  • Вопрос задан
  • 418 просмотров
Решения вопроса 1
Во-первых, как уже сказал Sumor, вам нужно подумать прежде всего о транзакционности операции, ваша задача - уменьшение значения Долга при занесении платежа - классический случай выполнения нескольких изменений в рамках одной транзакции. Так что это операцию вполне можно выполнить и на уровне приложения. С триггером могут быть свои заморочки - например, если впоследствии заходите удалить часть записей о платежах или перезалить их без изменения долга - то триггер придется отключить. Или как сказал Sumor, можно отключить их случайно и не заметить. С деньгами таких ситуаций надо избегать еще при проектировании. В общем конечно триггеры - вполне приемлемый способ обновления вычисляемых данных (долг - это именно такое значение), но я думаю в приложения, критичных к точности данных, лучше от них воздержаться.
Или же вам подойдут хранимые процедуры - тогда логика изменения долга и добавления платежа будет более очевидной, и на уровне БД. Тогда вам нужно будет ограничить доступ к основным таблицам, чтобы случайно их никто не поменял, а все изменения допускать только с использованием хранимок. Этот подход менее масштабируемый, чем логика на уровне приложения, но более надежный, если у вас большой проект и много разработчиков - у БД в этом случае будет свой слой безопасности.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
Melkij
@Melkij
PostgreSQL DBA
Поскольку не указано, о какой СУБД речь, скажу о postgresql и mysql
www.postgresql.org/docs/9.4/static/plpgsql-trigger.html
https://dev.mysql.com/doc/refman/5.6/en/trigger-sy...
Мануалы и той и другой СУБД вполне показывают и ссылки на OLD/NEW и какие-то операции над данными.
Ответ написан
Комментировать
@Sumor
Для SQLServer это таблицы inserted и deleted Использование таблиц inserted и deleted.
Подумайте об использовании транзакций вместо триггеров. Особенно если предполагается отмена действия в триггере по какому-либо условию.
Триггер отделён от логики добавления данных о платеже и изучающему ваш код будет неочевидно почему изменилась таблица Долг.
Триггеры можно случайно/специально/для отладки отключить и вы получите кучу проблем.
Ответ написан
Комментировать
Fadmin
@Fadmin
Голову не ломать, триггеры не писать.
Триггеры применяются когда уже совсем нет другого выхода, с ними приходит куча проблем и понимание - надо было делать на хранимках.
У вас есть отличный способ избежать этих раздумий, делайте на хранимках в одной транзакции с обработкой ошибок, задача простейшая.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы