Zzepish
5.01.2017 - 19:08
DELIMITER //
CREATE TRIGGER `add_ten_percent` AFTER UPDATE ON `users`
FOR EACH ROW BEGIN
UPDATE
`users`
SET
`money` = (`money`+`money`/10)
WHERE
`id` = NEW.`referer`;
END
Пишу тайкой триггер. Суть в чем: чтоб при добавлении юзером денег, у его реферера сумма увеличивалась на 10 процентов от внесенных средств.
Но у меня так не работат.
Фишка в том, что `money` = (`money`+`money`/10) сюда подставляеться значение из именяемой строки (т.е. не реферера, а текущего юзера), как и сюда `id` = NEW.`referer`; . Что я делаю не так?
Как минимум с логикой проблемы.
Даже то, что пытаешься начислить (неважно кому) 10% от уже имеющейся у него суммы (а не от внесенной пользователем):
`money` = (`money`+`money`/10)
_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
Zzepish
5.01.2017 - 20:16
T1grOK
Согласен. Под конец дня уже замахался и туплю.
Так как решить проблему?
Настоятельно рекомендую не использовать триггеры и прочую функциональность которая позволяет в СУБД реализовывать логику приложения. Уже была тема, там была речь о датах и таймзонах, тут теже самые принципы. Инструмент есть, но его лучше не использовать.
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
sergeiss
5.01.2017 - 22:56
chee, триггеры можно и нужно использовать, ибо они для того и сделаны, чтобы работать.
Цитата (Zzepish @ 5.01.2017 - 19:08) |
Что я делаю не так? |
Во-первых, ты вызываешь UPDATE таблицы из триггера AFTER UPDATE этой же таблицы. Это же и во-вторых, и в-третьих
В Мускуле нельзя апдейтить таблицу в такой ситуации. Погугли по словам "mysql trigger update same table".
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
waldicom
5.01.2017 - 23:07
Цитата (chee @ 5.01.2017 - 19:13) |
Настоятельно рекомендую не использовать триггеры |
Цитата (sergeiss @ 5.01.2017 - 19:56) |
триггеры можно и нужно использовать
|
Вот вам третье мнение: триггеры можно использовать в "своем" (локальном) продукте, когда только вы им пользуетесь. И нельзя(=не надо) в широко используемых продуктах (cms, ecommerce, etc)
_____________
Свои мозги еще никто не отменял.
Телепатов нету.
Цитата (sergeiss @ 5.01.2017 - 22:56) |
chee, триггеры можно и нужно использовать, ибо они для того и сделаны, чтобы работать. |
Во многих продуктах много чего сделано, но это не означает, что все из этого нужно использовать. Цель разработчиков - срубить максимум хайпа. Они готовы зарелизить любой фичареквест на который спрос чуть более чем у полторы калеки. Их не интересует, правильно ли это с точки зрения архитектуры или нет. Их интересует количество пользователей и денег вокруг их продукта.
Если ты используешь то, что тебе предлагают, только потому что оно есть, тогда ты просто жертва маркетинга. Нужно сначала взвесить плюсы и минусы и только потом принимать решение. У триггеров действительно серьезный минус в размывании логики приложения, при том, что всё что они предлагают можно реализовать на уровне приложения. Этого уже достаточно, чтобы их не использовать.
Цитата (Guest @ 5.01.2017 - 23:14) |
Если ты используешь то, что тебе предлагают, только потому что оно есть, тогда ты просто жертва маркетинга. Нужно сначала взвесить плюсы и минусы и только потом принимать решение. У триггеров действительно серьезный минус в размывании логики приложения, при том, что всё что они предлагают можно реализовать на уровне приложения. Этого уже достаточно, чтобы их не использовать. |
примерно это я и имел ввиду
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Цитата (sergeiss @ 5.01.2017 - 22:56) |
chee, триггеры можно и нужно использовать, ибо они для того и сделаны, чтобы работать. |
Я не отрицаю, что они работают.
На основе СУБД(типа mysql и других) можно выстроить примитивные приложения с пользователями, правами, отчетами, планировщиком и логикой, вот для этого все эти инструменты там и нужны (тригеры, планировщик, работа с временными зонами).
Но мы то делаем апликухи (на всём что угодно кроме СУБД) и используем эту СУБД как хранилище, так зачем туда нести логику, которая должна быть в апликухе. Логика в СУБД была резонна только тогда когда мы бы делали апликуху на самой СУБД.
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
sergeiss
5.01.2017 - 23:29
Guest,
chee - естественно, что триггеры надо использовать не потому, что они есть, а там, где они нужны.
Но у меня с вами, похоже, очень сильно отличается восприятие того, где они нужны
Потому что я уверен, что в БД можно и нужно передавать часть логики приложения, которая хорошо и удобно реализуется в БД. Кроме всего прочего, это быстрее получается. Также можно быть уверенным, что всё будет сделано правильно - особенно в случае, когда над проектом работают много разработчиков. И кто-то где-то может забыть (или не знать), что после таких-то действий надо еще сделать то-то и то-то. А если это реализовано в БД, то им об этом и знать не надо. А уж если разные приложения "вдруг" обращаются к одной и той же БД, то тут уж без обработки данных в БД вообще никак не обойдешься.
В идеале, в БД надо просто передавать данные для записи, а она сама должна делать всю необходимую доработку. И БД должна отдавать запрошенные данные в том виде, чтобы их сразу можно было использовать без дополнительной обработки в приложении.
PS. Видел тут одну вакансию... Предлагали делать веб-страницу + приложение для мобилы, с использованием Постгре,
с реализацией всей логики приложения на стороне БД. За очень хорошие бабки предлагали работать
Я им отправил резюме. Не ответили. На странице компании нашел имена и фото людей, нашел их ВКонтакте. Пообщались. Я так и не понял, чем я им не подошел. И не знаю, нашли ли они кого-нибудь другого.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
sergeiss, я тебя понимаю, но ты втираешь какую-то дичь. Я понимаю "что ты увидел, что шалаши из говна и палок строятся довольно быстро, но это не означает, что такие калаши это кашерные здания и в них возможно удобно жить".
_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
Цитата (chee @ 5.01.2017 - 23:26) |
используем эту СУБД как хранилище, так зачем туда нести логику, которая должна быть в апликухе. |
Так давайте и auto increment не будем использовать никогда тоже. Тригеры, хранимые процедуры - мощный и удобный инструмент, так зачем от него отказываться. В системах, когда одну БД используют несколько независимых компонентов, реализация логики хранилища именно в хранилище (внезапно) выглядит более чем логично, как уже заметил sergeiss - это и id, и например, счетчики товаров в каталоге, и прочее.
killer8080
5.01.2017 - 23:57
Цитата (chee @ 5.01.2017 - 22:13) |
Уже была тема, там была речь о датах и таймзонах, тут теже самые принципы. Инструмент есть, но его лучше не использовать.
|
точно, а я то думаю, где то забыл ответить
Цитата (kaww @ 5.01.2017 - 23:41) |
Так давайте и auto increment не будем использовать никогда тоже. |
+1 это же нарушает пассивность хранилища
sergeiss
5.01.2017 - 23:58
Цитата (chee @ 5.01.2017 - 23:37) |
но ты втираешь какую-то дичь |
В чем именно заключается "дичь"?
Вот я пример чуть выше пример. Требования в вакансии: БД, веб-сервер с клиентом и мобильное приложение. ГДЕ реализовывать бизнес-логику? Одновременно на сервере и в мобильном приложении? И разрабатывать, и потом модифицировать? А надо реально одновременно менять, иначе будут нестыковки в данных. Нафиг-нафиг, такой подход с вероятностью 100% приведет к ошибкам. Вся обработка должна делаться в одном месте. И таким местом является как раз БД.
Про шалаши не понял. Я наоборот предлагаю строить не "шалаши из говна и палок", а нормальные здания из современных материалов - если уж проводить строительную аналогию.
_____________
*
Хэлп по PHP*
Описалово по JavaScript *
Хэлп и СУБД для PostgreSQL*
Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги. *
"накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)
Цитата (kaww @ 5.01.2017 - 23:41) |
Так давайте и auto increment не будем использовать никогда тоже. |
Никогда не нужно, а вот иногда имеет смысл. Если будем шардить таблицы по серверам
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.