[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Триггер
Страницы: 1, 2, 3, 4
Zzepish
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`; . Что я делаю не так?
T1grOK
Как минимум с логикой проблемы.
Даже то, что пытаешься начислить (неважно кому) 10% от уже имеющейся у него суммы (а не от внесенной пользователем):

`money` = (`money`+`money`/10)


_____________
Mysql, Postgresql, Redis, Memcached, Unit Testing, CI, Kohana, Yii, Phalcon, Zend Framework, Joomla, Open Cart, Ymaps, VK Api
Zzepish
T1grOK
Согласен. Под конец дня уже замахался и туплю.
Так как решить проблему?
chee
Настоятельно рекомендую не использовать триггеры и прочую функциональность которая позволяет в СУБД реализовывать логику приложения. Уже была тема, там была речь о датах и таймзонах, тут теже самые принципы. Инструмент есть, но его лучше не использовать.

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
sergeiss
chee, триггеры можно и нужно использовать, ибо они для того и сделаны, чтобы работать.

Цитата (Zzepish @ 5.01.2017 - 19:08)
Что я делаю не так?

Во-первых, ты вызываешь UPDATE таблицы из триггера AFTER UPDATE этой же таблицы. Это же и во-вторых, и в-третьих smile.gif
В Мускуле нельзя апдейтить таблицу в такой ситуации. Погугли по словам "mysql trigger update same table".

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
waldicom
Цитата (chee @ 5.01.2017 - 19:13)
Настоятельно рекомендую не использовать триггеры

Цитата (sergeiss @ 5.01.2017 - 19:56)
триггеры можно и нужно использовать

Вот вам третье мнение: триггеры можно использовать в "своем" (локальном) продукте, когда только вы им пользуетесь. И нельзя(=не надо) в широко используемых продуктах (cms, ecommerce, etc)

_____________
Свои мозги еще никто не отменял.
Телепатов нету.
Guest
Цитата (sergeiss @ 5.01.2017 - 22:56)
chee, триггеры можно и нужно использовать, ибо они для того и сделаны, чтобы работать.

Во многих продуктах много чего сделано, но это не означает, что все из этого нужно использовать. Цель разработчиков - срубить максимум хайпа. Они готовы зарелизить любой фичареквест на который спрос чуть более чем у полторы калеки. Их не интересует, правильно ли это с точки зрения архитектуры или нет. Их интересует количество пользователей и денег вокруг их продукта.

Если ты используешь то, что тебе предлагают, только потому что оно есть, тогда ты просто жертва маркетинга. Нужно сначала взвесить плюсы и минусы и только потом принимать решение. У триггеров действительно серьезный минус в размывании логики приложения, при том, что всё что они предлагают можно реализовать на уровне приложения. Этого уже достаточно, чтобы их не использовать.
chee
Цитата (Guest @ 5.01.2017 - 23:14)

Если ты используешь то, что тебе предлагают, только потому что оно есть, тогда ты просто жертва маркетинга. Нужно сначала взвесить плюсы и минусы и только потом принимать решение. У триггеров действительно серьезный минус в размывании логики приложения, при том, что всё что они предлагают можно реализовать на уровне приложения. Этого уже достаточно, чтобы их не использовать.

примерно это я и имел ввиду

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
chee
Цитата (sergeiss @ 5.01.2017 - 22:56)
chee, триггеры можно и нужно использовать, ибо они для того и сделаны, чтобы работать.

Я не отрицаю, что они работают.

На основе СУБД(типа mysql и других) можно выстроить примитивные приложения с пользователями, правами, отчетами, планировщиком и логикой, вот для этого все эти инструменты там и нужны (тригеры, планировщик, работа с временными зонами).

Но мы то делаем апликухи (на всём что угодно кроме СУБД) и используем эту СУБД как хранилище, так зачем туда нести логику, которая должна быть в апликухе. Логика в СУБД была резонна только тогда когда мы бы делали апликуху на самой СУБД.


_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
sergeiss
Guest, chee - естественно, что триггеры надо использовать не потому, что они есть, а там, где они нужны.
Но у меня с вами, похоже, очень сильно отличается восприятие того, где они нужны smile.gif Потому что я уверен, что в БД можно и нужно передавать часть логики приложения, которая хорошо и удобно реализуется в БД. Кроме всего прочего, это быстрее получается. Также можно быть уверенным, что всё будет сделано правильно - особенно в случае, когда над проектом работают много разработчиков. И кто-то где-то может забыть (или не знать), что после таких-то действий надо еще сделать то-то и то-то. А если это реализовано в БД, то им об этом и знать не надо. А уж если разные приложения "вдруг" обращаются к одной и той же БД, то тут уж без обработки данных в БД вообще никак не обойдешься.

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

PS. Видел тут одну вакансию... Предлагали делать веб-страницу + приложение для мобилы, с использованием Постгре, с реализацией всей логики приложения на стороне БД. За очень хорошие бабки предлагали работать smile.gif Я им отправил резюме. Не ответили. На странице компании нашел имена и фото людей, нашел их ВКонтакте. Пообщались. Я так и не понял, чем я им не подошел. И не знаю, нашли ли они кого-нибудь другого.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
chee
sergeiss, я тебя понимаю, но ты втираешь какую-то дичь. Я понимаю "что ты увидел, что шалаши из говна и палок строятся довольно быстро, но это не означает, что такие калаши это кашерные здания и в них возможно удобно жить".

_____________
Люди, имеющие низкий уровень квалификации, делают ошибочные выводы, принимают неудачные решения и при этом неспособны осознавать свои ошибки в силу низкого уровня своей квалификации
kaww
Цитата (chee @ 5.01.2017 - 23:26)
используем эту СУБД как хранилище, так зачем туда нести логику, которая должна быть в апликухе.

Так давайте и auto increment не будем использовать никогда тоже. Тригеры, хранимые процедуры - мощный и удобный инструмент, так зачем от него отказываться. В системах, когда одну БД используют несколько независимых компонентов, реализация логики хранилища именно в хранилище (внезапно) выглядит более чем логично, как уже заметил sergeiss - это и id, и например, счетчики товаров в каталоге, и прочее.
killer8080
Цитата (chee @ 5.01.2017 - 22:13)
Уже была тема, там была речь о датах и таймзонах, тут теже самые принципы. Инструмент есть, но его лучше не использовать.

точно, а я то думаю, где то забыл ответить smile.gif

Цитата (kaww @ 5.01.2017 - 23:41)
Так давайте и auto increment не будем использовать никогда тоже.

+1 это же нарушает пассивность хранилища laugh.gif
sergeiss
Цитата (chee @ 5.01.2017 - 23:37)
но ты втираешь какую-то дичь

В чем именно заключается "дичь"? smile.gif

Вот я пример чуть выше пример. Требования в вакансии: БД, веб-сервер с клиентом и мобильное приложение. ГДЕ реализовывать бизнес-логику? Одновременно на сервере и в мобильном приложении? И разрабатывать, и потом модифицировать? А надо реально одновременно менять, иначе будут нестыковки в данных. Нафиг-нафиг, такой подход с вероятностью 100% приведет к ошибкам. Вся обработка должна делаться в одном месте. И таким местом является как раз БД.

Про шалаши не понял. Я наоборот предлагаю строить не "шалаши из говна и палок", а нормальные здания из современных материалов - если уж проводить строительную аналогию.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Guest
Цитата (kaww @ 5.01.2017 - 23:41)
Так давайте и auto increment не будем использовать никогда тоже.

Никогда не нужно, а вот иногда имеет смысл. Если будем шардить таблицы по серверам ohmy.gif
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.