|
|
|
Рекурсивный BEFORE UPDATE триггер. Не сохраняется последнее возвращаемое значение
|
|||
|---|---|---|---|
|
#18+
Помогите разобраться, никак не могу понять как работает рекурсивный триггер. Проблема более понятна на примере: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. В результате видим следующее: Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. Почему в результате поле "value" обновилось и стало "3", а поле "status" так и осталось со значением "1" при том что самый первый вызванный триггер вернул строку (1, 1, 1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2014, 19:18:00 |
|
||
|
Рекурсивный BEFORE UPDATE триггер. Не сохраняется последнее возвращаемое значение
|
|||
|---|---|---|---|
|
#18+
aTz (msk), ндак это вы сказали в конце RETURN NEW; а не пупкин. прочитайте в notice, чему у вас NEW.value равен. и всё поймёте. делайте либо after, как делаете либо before, но вместо "рекурсивного " вызова через одно место просто скажиет перед RETURN NEW; NEW.value :=3; и все, никаких "рекурсивных опдейтов нинада ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2014, 20:21:16 |
|
||
|
Рекурсивный BEFORE UPDATE триггер. Не сохраняется последнее возвращаемое значение
|
|||
|---|---|---|---|
|
#18+
пуупкин, таки вчитался. как работает - понятно. на 1-й записи отрабатывает 2 триггера (точнее 2 раза - один). тот который стартовал последним - того и тапки - тот и возвращает последнее слово через return new; независимо от того, кто якобы последний вдоль по "нити" Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. почему так - надо код пж смотреть. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.02.2014, 21:00:29 |
|
||
|
Рекурсивный BEFORE UPDATE триггер. Не сохраняется последнее возвращаемое значение
|
|||
|---|---|---|---|
|
#18+
aTz (msk) Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. Почему в результате поле "value" обновилось и стало "3", а поле "status" так и осталось со значением "1" при том что самый первый вызванный триггер вернул строку (1, 1, 1) Потому, что именно это вы и заложили в свой триггер. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 17:00:48 |
|
||
|
Рекурсивный BEFORE UPDATE триггер. Не сохраняется последнее возвращаемое значение
|
|||
|---|---|---|---|
|
#18+
aTz (msk) Код: powershell 1. 2. 3. 4. 5. 6. 7. 8. Почему в результате поле "value" обновилось и стало "3", а поле "status" так и осталось со значением "1" при том что самый первый вызванный триггер вернул строку (1, 1, 1)postgres же Вам подсказывает: ОБНОВЛЕНО СТРОК 0 (UPDATE 0) :) У Вас триггер before, а внутри него Вы изменили строку к которой он должен был применяться. То есть когда из триггера возвращается RETURNED NEW: (1,2,2) его уже не к чему применять, исходная обновляемая строка уже изменена и PG ничего не делает (UPDATE 0). Если бы он её применил, то просто бы затёр новую строку (1,1,3). PS: в 9.3 у Вас, кстати, было бы сообщение об ошибке: Код: plaintext 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.02.2014, 17:03:19 |
|
||
|
Рекурсивный BEFORE UPDATE триггер. Не сохраняется последнее возвращаемое значение
|
|||
|---|---|---|---|
|
#18+
Ёшpostgres же Вам подсказывает: ОБНОВЛЕНО СТРОК 0 (UPDATE 0) :) У Вас триггер before, а внутри него Вы изменили строку к которой он должен был применяться. То есть когда из триггера возвращается RETURNED NEW: (1,2,2) его уже не к чему применять, исходная обновляемая строка уже изменена и PG ничего не делает (UPDATE 0). Если бы он её применил, то просто бы затёр новую строку (1,1,3). PS: в 9.3 у Вас, кстати, было бы сообщение об ошибке: Код: plaintext 1. 2. Да, спасибо всем за ответы! Собственно говоря я уже и пришёл к этому умозаключению сам, а ваши ответы это подтвердили. Жаль что у меня не 9.3, вопрос бы даже и не возник :) Я подошёл к этому вопросу с точки зрения рекурсивного вызова, когда обычно итоговый результат возвращает корневой вызов, забыв что это БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.02.2014, 21:28:56 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=38552513&tid=1998856]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
177ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 182ms |
| total: | 440ms |

| 0 / 0 |
