![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 10.02.2016
Сообщений: 9
|
![]()
Здравствуйте!
Помогите, пожалуйста, с триггером. Есть две таблицы: product - в ней содержатся данные о товаре и category - данные о категориях товаров В таблице product есть два поля: cost_price - себестоимость и retail_price - цена продажи, которая рассчитывается как произведение: cost_price * category_mark_up (наценка из таблицы category). Код триггера на вставку отрабатывает нормально, retail_price считается верно. Вот сам код: Код:
Проблема с триггером на обновление. Я думал, что по сути он работает также, то есть код практически тот же: Код:
Подскажите, пожалуйста, что надо подправить в коде. Пробовал с реализацией через старые и новые значения (inserted / deleted), но совсем не пошло |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
а почему триггер на таблице product должен реагировать на изменение в таблице category?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#3 |
Регистрация: 10.02.2016
Сообщений: 9
|
![]()
Ну с триггером на вставку мне понятно. Я объявил две переменные, присвоил им значения из двух таблиц, перемножил.
А вот с триггером на обновление не понимаю, как сделать. Хотя логика вроде та же. Если меняется наценка category_mark_up для данного id_product, то цена retail_price должна пересчитываться. Я уже понял, что в моем триггере обновление срабатывает лишь в том, случае, когда меняется cost_price. Что делать? Соединять таблицы через JOIN? А ведь одна из переменных может и не меняться. Тогда как? Проверить сначала, изменилось ли поле? |
![]() |
![]() |
![]() |
#4 | ||
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
наценка на категории обновляется в другой таблице.
вы обратите внимание на какую таблицу триггер то висит. Цитата:
вешать триггер на обновление в таблицу category, и там(если изменилось) пересчитывать все продукты этой категории(один апдейт всего) Цитата:
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
||
![]() |
![]() |
![]() |
#5 |
Регистрация: 10.02.2016
Сообщений: 9
|
![]()
Вашу мысль то я понял. Но допустим я создам триггер на обновление наценки category_mark_up и навешу его на таблицу category.
Но потом же как-то надо увязать новые значения? Формула расчета у меня в первом триггере. То есть все равно придется объявлять в первом триггере переменную, принимающую значение наценки. Вот этот момент я никак не могу сообразить. Может, подскажете типовое решение для такого случая? Я правильно понимаю, что: 1) пишем второй триггер на обновление наценки и вешаем его на таблицу category 2) код первого триггера по сути не меняется, то есть AS INSERT, UPDATE |
![]() |
![]() |
![]() |
#6 |
Регистрация: 10.02.2016
Сообщений: 9
|
![]()
Не увидел ваше отредактированное сообщение.
А как может выглядеть код - условие на проверку изменения поля category_mark_up? |
![]() |
![]() |
![]() |
#7 |
Регистрация: 10.02.2016
Сообщений: 9
|
![]()
Пепел Феникса, дайте, пожалуйста, ссылку на пример, как это делается. Или поделитесь кодом. Честное слово, уже мыслей нет, как это надо реализовать )
Я уже и через представления пробовал, такой вариант, наверно, тоже подойдет. Но хочется разобраться с триггерами Последний раз редактировалось don_zaresh; 17.09.2016 в 22:56. |
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]()
Примерно так, писано на коленке
Код:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
![]() |
![]() |
![]() |
#9 |
Регистрация: 10.02.2016
Сообщений: 9
|
![]()
Аватар, спасибо! Сейчас буду разбираться. А что значит, "не будет рекурсии"?
|
![]() |
![]() |
![]() |
#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 |