|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
17.09.2016, 12:17 | #1 |
Регистрация: 10.02.2016
Сообщений: 9
|
триггер на обновление
Здравствуйте!
Помогите, пожалуйста, с триггером. Есть две таблицы: product - в ней содержатся данные о товаре и category - данные о категориях товаров В таблице product есть два поля: cost_price - себестоимость и retail_price - цена продажи, которая рассчитывается как произведение: cost_price * category_mark_up (наценка из таблицы category). Код триггера на вставку отрабатывает нормально, retail_price считается верно. Вот сам код: Код:
Проблема с триггером на обновление. Я думал, что по сути он работает также, то есть код практически тот же: Код:
Подскажите, пожалуйста, что надо подправить в коде. Пробовал с реализацией через старые и новые значения (inserted / deleted), но совсем не пошло |
17.09.2016, 12:33 | #2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
а почему триггер на таблице product должен реагировать на изменение в таблице category?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
17.09.2016, 12:51 | #3 |
Регистрация: 10.02.2016
Сообщений: 9
|
Ну с триггером на вставку мне понятно. Я объявил две переменные, присвоил им значения из двух таблиц, перемножил.
А вот с триггером на обновление не понимаю, как сделать. Хотя логика вроде та же. Если меняется наценка category_mark_up для данного id_product, то цена retail_price должна пересчитываться. Я уже понял, что в моем триггере обновление срабатывает лишь в том, случае, когда меняется cost_price. Что делать? Соединять таблицы через JOIN? А ведь одна из переменных может и не меняться. Тогда как? Проверить сначала, изменилось ли поле? |
17.09.2016, 12:54 | #4 | ||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
наценка на категории обновляется в другой таблице.
вы обратите внимание на какую таблицу триггер то висит. Цитата:
вешать триггер на обновление в таблицу category, и там(если изменилось) пересчитывать все продукты этой категории(один апдейт всего) Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
||
17.09.2016, 13:00 | #5 |
Регистрация: 10.02.2016
Сообщений: 9
|
Вашу мысль то я понял. Но допустим я создам триггер на обновление наценки category_mark_up и навешу его на таблицу category.
Но потом же как-то надо увязать новые значения? Формула расчета у меня в первом триггере. То есть все равно придется объявлять в первом триггере переменную, принимающую значение наценки. Вот этот момент я никак не могу сообразить. Может, подскажете типовое решение для такого случая? Я правильно понимаю, что: 1) пишем второй триггер на обновление наценки и вешаем его на таблицу category 2) код первого триггера по сути не меняется, то есть AS INSERT, UPDATE |
17.09.2016, 13:03 | #6 |
Регистрация: 10.02.2016
Сообщений: 9
|
Не увидел ваше отредактированное сообщение.
А как может выглядеть код - условие на проверку изменения поля category_mark_up? |
17.09.2016, 22:27 | #7 |
Регистрация: 10.02.2016
Сообщений: 9
|
Пепел Феникса, дайте, пожалуйста, ссылку на пример, как это делается. Или поделитесь кодом. Честное слово, уже мыслей нет, как это надо реализовать )
Я уже и через представления пробовал, такой вариант, наверно, тоже подойдет. Но хочется разобраться с триггерами Последний раз редактировалось don_zaresh; 17.09.2016 в 22:56. |
18.09.2016, 07:58 | #8 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Примерно так, писано на коленке
Код:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
18.09.2016, 14:22 | #9 |
Регистрация: 10.02.2016
Сообщений: 9
|
Аватар, спасибо! Сейчас буду разбираться. А что значит, "не будет рекурсии"?
|
18.09.2016, 14:26 | #10 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Триггер | Svyatoslav359 | SQL, базы данных | 0 | 25.05.2016 22:07 |
Триггер | Babur4iK | SQL, базы данных | 3 | 08.11.2012 16:28 |
Обновление DataSet. Триггер. | _SERGEYX_ | БД в Delphi | 2 | 08.09.2010 15:31 |
Триггер | Neymexa | SQL, базы данных | 1 | 01.04.2010 18:50 |
Триггер? | yulia | БД в Delphi | 9 | 12.05.2007 15:03 |