|
Rule: почему оно так работает?
|
|||
---|---|---|---|
#18+
есть таблица - лог платежей пользователей Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
у неё есть правило, которое отнимает и прибавляет деньги на лицевом счету пользователей: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
лицевые счета хранятся тут: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
казалось бы, всё отлично работает. Но, если сделать запись в лог сразу двух строк таким образом: Код: plaintext 1. 2. 3. 4. 5.
то на счету пользователя прибавляется только 150 единиц денег а не 200 Вопрос: почему так происходит? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2010, 16:08 |
|
Rule: почему оно так работает?
|
|||
---|---|---|---|
#18+
Weed, а версия сервера у Вас какая? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2010, 16:35 |
|
Rule: почему оно так работает?
|
|||
---|---|---|---|
#18+
После автор(true, 'Вася', 'MMM', 50) поставить точку с запятой? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2010, 16:52 |
|
Rule: почему оно так работает?
|
|||
---|---|---|---|
#18+
ЁшWeed, а версия сервера у Вас какая? /usr/lib/postgresql/9.0/bin/postgres --version postgres (PostgreSQL) 9.0.1 дебиановский пакет: postgresql-9.0 9.0.1-1 Big AndyПосле автор(true, 'Вася', 'MMM', 50) поставить точку с запятой? нее, это я просто из pgadmin3 запрос делал, дело не в этом ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2010, 16:59 |
|
Rule: почему оно так работает?
|
|||
---|---|---|---|
#18+
Weed, 255 раз писали не используйте рулы для чего то сложнее перевода insert/delete/update из views. А ответ почему так содержится в том механизме как рулы работают... например вот тут вот: http://www.depesz.com/index.php/2010/06/15/to-rule-or-not-to-rule-that-is-the-question/ ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2010, 17:11 |
|
Rule: почему оно так работает?
|
|||
---|---|---|---|
#18+
Maxim BogukWeed, 255 раз писали не используйте рулы для чего то сложнее перевода insert/delete/update из views. А ответ почему так содержится в том механизме как рулы работают... например вот тут вот: http://www.depesz.com/index.php/2010/06/15/to-rule-or-not-to-rule-that-is-the-question/ у правил есть один плюс, который для меня лично перекрывает всё: по сравнению с триггерми в них практически не бывает синтаксических ошибок, что позволяет отловить проблему в момент сохранения правила а не в момент когда юзеры начнут жаловаться это же касается и изменений в БД - триггер не поднимет тревогу если нужное ему поле таблицы внезапно пропало ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2010, 17:19 |
|
Rule: почему оно так работает?
|
|||
---|---|---|---|
#18+
Я правильно написал, парсер именно так распарсит правило? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
в упор не вижу что тут криминального? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2010, 18:46 |
|
Rule: почему оно так работает?
|
|||
---|---|---|---|
#18+
Weed, а, всё понял, несколько раз set amount = amount + n вызывается для одной и той же строки никогда не думал что подряд выставленные значения set для одной строки не сохраняются а перезаписываются дело тут даже и не в рулесах ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2010, 19:14 |
|
Rule: почему оно так работает?
|
|||
---|---|---|---|
#18+
Weed, судя по всему у парсера после вставки правила в запрос получается что-то типа такого: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8.
ps: Вообще, согласитесь, было бы странно если бы UPDATE выполнялся для одной и той же строки несколько раз в одном запросе ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2010, 19:18 |
|
Rule: почему оно так работает?
|
|||
---|---|---|---|
#18+
WeedЯ правильно написал, парсер именно так распарсит правило? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
в упор не вижу что тут криминального?Не в FROM, а в WHERE, как Вы сами написали. На FROM сервер ругается: Код: plaintext 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2010, 19:45 |
|
Rule: почему оно так работает?
|
|||
---|---|---|---|
#18+
Weed, авторcurrency_id text NOT NULL сильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.10.2010, 20:19 |
|
Rule: почему оно так работает?
|
|||
---|---|---|---|
#18+
анонимусWeed, авторcurrency_id text NOT NULL сильно. что не так? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2010, 10:00 |
|
Rule: почему оно так работает?
|
|||
---|---|---|---|
#18+
Ёш, получается, на рулесах в принципе нельзя такой запрос как мне надо написать? аггрегат sum() оно не позволяет на псевдореляцию new натравить... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.10.2010, 10:01 |
|
Rule: почему оно так работает?
|
|||
---|---|---|---|
#18+
Weed у правил есть один плюс, который для меня лично перекрывает всё: по сравнению с триггерми в них практически не бывает синтаксических ошибок, что позволяет отловить проблему в момент сохранения правила а не в момент когда юзеры начнут жаловаться это же касается и изменений в БД - триггер не поднимет тревогу если нужное ему поле таблицы внезапно пропало а ,старый знакомый : авторя избегаю повторяющихся почти одинаковых запросов. если бы я расписал на 2 запроса это то лучше бы точно не стало, визуально легко было бы потерять где в какую сторону условие или сортировка. я уже даже один раз так потерял - пришлось по логам базу восстанавливать (ценный опыт :)) а чтобы возвращаться обильно поливаю каментами каждое действие"а он всегда был спорщиком - припрут к стене - откажется. прошёл он коридорчиком и кончил стенкой, кажется" PS мне очень интересно, как триггер не пошлёт вас лесом, если поле ,им пользуемое, пропадёт. наверное вы поленитесь проверить срабатывание триггеров после альтер-таблицы. я правильно понял? (и очень интересно, зачем дропать поля в таблице. особо если учесть, что реально они в постгресе не дропаются). а "внезапно"(тм) так вообще - пестня. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2010, 12:03 |
|
Rule: почему оно так работает?
|
|||
---|---|---|---|
#18+
WeedWeed, а, всё понял, несколько раз set amount = amount + n вызывается для одной и той же строки никогда не думал что подряд выставленные значения set для одной строки не сохраняются а перезаписываются дело тут даже и не в рулесах именно в рулесах. рулесы это не триггера, а "макросы". все значения в строках рулесов "макровычислимы", а не "последовательно обновимы", как вам тут требуется. (забавно, что вы еще не знаете что в многострочном рулесе сам состав (и количество строк) NEW может поменяться, т.к. рулесы еще и "атомарности" не обеспечивают. NEW это даже не "снепшот") рулесы в постгресе это макробаг. а любители рулесов (упорствующие) - сами себе буратинки. (я тоже как-то убил кучу времени на). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2010, 12:16 |
|
Rule: почему оно так работает?
|
|||
---|---|---|---|
#18+
вот придумал - попробуйте такую шнягу: распишите в многострочный руле с криэйт-темп-табл примерно как AS SELECT NEW.* и вставкой агрегата уже из темпа. может и получиться. если рулес не потеряет темп-таблу между своими стейтментами. (можно и через постоянку робить, но с идентификатором транзакции [или чего-то подобного] в ключе. как выцеплять ид транзакции кажется тут встречалось). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.11.2010, 12:22 |
|
Rule: почему оно так работает?
|
|||
---|---|---|---|
#18+
1chainikвот придумал - попробуйте такую шнягу: распишите в многострочный руле с криэйт-темп-табл примерно как AS SELECT NEW.* и вставкой агрегата уже из темпа. может и получиться. если рулес не потеряет темп-таблу между своими стейтментами. (можно и через постоянку робить, но с идентификатором транзакции [или чего-то подобного] в ключе. как выцеплять ид транзакции кажется тут встречалось). спасибо, это уже как то чересчур. сделал таки триггером. про триггеры и рулесы: когда в базе среднего размера (50 таблиц) всего два триггера уследить за ними не сложно ... |
|||
:
Нравится:
Не нравится:
|
|||
03.11.2010, 19:06 |
|
Rule: почему оно так работает?
|
|||
---|---|---|---|
#18+
У меня один-в один ситуация, тоже баланс лицевого счета нужно обновлять. После того как с этим столкнулся, полностью ушел от рулесов, оставил их только для view. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.11.2010, 20:33 |
|
Rule: почему оно так работает?
|
|||
---|---|---|---|
#18+
тоже столкнулся с такой проблемой, подумал, как исправить и минимальными передалками - сделал функцию adjust_balance(id, delta), которая изменяет баланс на нужную сумму, и зову её из rule. по сути получились самодельные триггеры 1chainik(забавно, что вы еще не знаете что в многострочном рулесе сам состав (и количество строк) NEW может поменяться, т.к. рулесы еще и "атомарности" не обеспечивают. NEW это даже не "снепшот") вот это предложение хотелось бы расшифровать ... |
|||
:
Нравится:
Не нравится:
|
|||
20.06.2017, 02:15 |
|
|
start [/forum/topic.php?fid=53&tid=1996436]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
40ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 133ms |
0 / 0 |