|
|
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
Задача стоит такая: пусть есть простенькая таблица Код: sql 1. Необходимо вставлять в таблицу логов следующие данные: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. т.к. во внешнем приложении писать такое лень, есть идея повесить триггер на таблицу (оно и правильнее), но, насколько я понимаю, в триггер никакие переменные передать нельзя . А мне нужно обязательно поле USER. Так вот, нужны идеи, как такое реализовать. Например, мне приходит в голову (я, правда, не знаю, есть ли такое или нет) при коннекте к базе из внешнего приложения (php) передать USER в глобальную переменную, к которой триггер будет потом обращаться. PS: Триггеры не создавал ни разу. Прошу дать совет, возможно ли такая реализация, или есть более грамотные способы. Может быть, кто-нибудь делал подобное. PPS: где найти мануал знаю) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2015, 16:01 |
|
||
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
PCContra, current_user ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2015, 17:22 |
|
||
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
PCContra, Понадобилось на днях примерно тоже, думаю сделать в главной таблице пару фейковых полей типа твоих user ip с default null и в бефоре триггере сностить полученные обычным образом значения из new, записав в лог. Костыль но в моем случае то, что надо )) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.07.2015, 23:54 |
|
||
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
drsmPCContra, Понадобилось на днях примерно тоже, думаю сделать в главной таблице пару фейковых полей типа твоих user ip с default null и в бефоре триггере сностить полученные обычным образом значения из new, записав в лог. Костыль но в моем случае то, что надо )) Ну у Вас тогда история изменений не будет вестись ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2015, 08:34 |
|
||
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
ARTURVPCContra, current_user У меня разные пользователи заходят каждый под своей учеткой в ПО, но к базе коннектятся под одним юзером. Поэтому current_user не подойдет. Если при каждом запросе в СУБД передается логин/пароль, и в СУБД никакой сессии, наподобие php-ных, не существует, то вариант, предложенный ARTURV, получается, единственный? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2015, 08:54 |
|
||
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
PCContra, Сделай конфиг-переменную и сохраняй туда данные прикладной сессии при авторизации в приложении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2015, 09:28 |
|
||
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
p2.PCContra, Сделай конфиг-переменную и сохраняй туда данные прикладной сессии при авторизации в приложении. А пример можно? "Сделай конфиг-переменную" во внешнем приложении? "сохраняй туда данные прикладной сессии" тоже во внешнем? задача-то стоит использовать триггеры или правила в СУБД, поэтому и пользоваться нужно тем, что там есть. Я бы рад сделать что-то типа: Код: sql 1. 2. 3. Как вместо current_user вставить свое значение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2015, 10:05 |
|
||
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
PCContradrsmPCContra, Понадобилось на днях примерно тоже, думаю сделать в главной таблице пару фейковых полей типа твоих user ip с default null и в бефоре триггере сностить полученные обычным образом значения из new, записав в лог. Костыль но в моем случае то, что надо )) Ну у Вас тогда история изменений не будет вестись ох, как-то так, идея думаю ясна: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2015, 11:56 |
|
||
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
drsm , до меня дошло, наконец-то. Да, идея простая. Это даже лучшее решение, по мне, чем создавать кучу ролей в СУБД ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2015, 14:17 |
|
||
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
drsm Код: sql 1. 2. А зачем пользователь и IP обнуляются? Если это необходимо, то вместо таблицы я бы сделал представление (view) и повесил бы триггер на него, переводя реальные данные в нужные таблицы и ведя лог. Без фейковых полей. Служебную информацию можно получить стандартными функциями : Код: sql 1. И если это то, что надо, то создавать дополнительные поля в основной таблице смысла нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.07.2015, 15:09 |
|
||
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
vyegorovЕсли это необходимо, то вместо таблицы я бы сделал представление (view) и повесил бы триггер на него, переводя реальные данные в нужные таблицы и ведя лог. Без фейковых полей. А вот это интересно. Как без фейковых полей, можно пример в студию. На самом деле, очень интересно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2015, 10:11 |
|
||
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
PCContra, Совсем без фейковых полей не получиться, но они присутствуют только в представлениях. Это схема для syslog'а (кажется, я не помню), которого настроили писать логи postfix'а в базу. Самая большая триггерная функция (последняя) делает всю работу по выделению получателей, адресов и изменению статуса сообщения. Мы потом еще что-то переделывали и добавляли, но не суть. Таблицы Код: 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. Функции Код: 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. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. Ну и пара триггеров: Код: sql 1. 2. Та самая вьюшка: Код: sql 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2015, 10:47 |
|
||
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
Решил дополнить Таким образом не получится реализовать логи при удалении записи. Если запись удаляем, то NEW.user, да и вообще, NEW.* не определено. А мне надо логи update и delete. Как реализовать логи удаления? Вариант "дописывать везде ручками, где происходим удаление" - не вариант ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2015, 11:12 |
|
||
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
PCContraЕсли запись удаляем, то NEW.user, да и вообще, NEW.* не определено. Зато, наверное, определено OLD.*?.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2015, 13:49 |
|
||
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
OLD.* конечно, определен. Но мы тут как решили (читайте выше): будем вставлять в исходную таблицу при UPDATE'е ник юзера, который изменил строку, в соответствующее поле. Таким образом получается, что в исходной таблице виден сотрудник, совершивший текущие изменения строки. При последующем изменении вся строку идет в лог. Таки образом можно реализовать логи INSERT'ов и UPDATE'ов, но вот логи DELETE'ов реализовать не получится ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2015, 14:14 |
|
||
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
PCContra, гм, у вас и молоко говенное делают и детей без фантазии ну сделайте фейковое поле deleted а в instead of триггере на update вьюхи удаляйте запись таблицы при этом NEW.* заполняйте чем хотите, и логируйте это вот всё хотя это всё от небольшого ума и большой лени -- правильнее было бы хранимками рулить -- там всё в руках писателя ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2015, 15:08 |
|
||
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
qwwqPCContra, гм, у вас и молоко говенное делают и детей без фантазии ну сделайте фейковое поле deleted а в instead of триггере на update вьюхи удаляйте запись таблицы при этом NEW.* заполняйте чем хотите, и логируйте это вот всё хотя это всё от небольшого ума и большой лени -- правильнее было бы хранимками рулить -- там всё в руках писателя А как хранимками указывать пользователя из внешней программы? У меня есть другая идея и такой вопрос: при создании объекта PDO в постгрессе создается какой-нибудь идентификатор соединения? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2015, 16:21 |
|
||
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
PCContra, p2. уже советовал, но еще раз: http://pgcookbook.ru/article/session_or_transaction_variables.html ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2015, 17:04 |
|
||
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
PCContraА как хранимками указывать пользователя из внешней программы?кхмм. какбе помяхше-то ну вот, кака бычна, -- через параметр. а вы что подумали ? PCContraУ меня есть другая идея и такой вопрос: при создании объекта PDO в постгрессе создается какой-нибудь идентификатор соединения?если вы ничего не пуллите -- имеете право создать переменную соединения. способов масса. (да даже если и пуллите -- и то, но техника немного иная. в том числе можно пользовать стандартную переменную пж, что-то типа application_name. она позволяет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.07.2015, 18:01 |
|
||
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
qwwqPCContraА как хранимками указывать пользователя из внешней программы?кхмм. какбе помяхше-то ну вот, кака бычна, -- через параметр. а вы что подумали ? PCContraУ меня есть другая идея и такой вопрос: при создании объекта PDO в постгрессе создается какой-нибудь идентификатор соединения?если вы ничего не пуллите -- имеете право создать переменную соединения. способов масса. (да даже если и пуллите -- и то, но техника немного иная. в том числе можно пользовать стандартную переменную пж, что-то типа application_name. она позволяет. Можно попросить написать пример про переменную соединения? У меня соединение происходит так: Код: php 1. Вычитал: Код: php 1. 2. 3. php.netЗамечание: Чтобы использовать постоянные соединения, необходимо добавить константу PDO::ATTR_PERSISTENT в массив параметров драйвера, который передается конструктору PDO. Думаю, есть вариант при создании объекта PDO указать или установить свою переменную Ну, или в торой вариант - есть pid - pg_backend_pid() И при создании объекта записывать связь юзера и процесс_айди можно так: Код: php 1. 2. А в теле триггера выбирать имя юзера по pid и использовать его в дальнейшем: Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2015, 10:16 |
|
||
|
Как можно реализовать логи?
|
|||
|---|---|---|---|
|
#18+
PCContra, выше же привели ссылку, где примеры установки сессионных переменных задаются. если 9.2+, то Код: sql 1. 2. 3. 4. 5. 6. 7. 8. иначе префикс custom переменных надо в конфиге предварительно прописать в custom_variable_classes. application_name (в случае использования pgbouncer) можно передавать в строке соединения прямо как-то так: Код: sql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.07.2015, 11:17 |
|
||
|
|

start [/forum/topic.php?fid=53&msg=39006529&tid=1997867]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
14ms |
get forum data: |
4ms |
get page messages: |
76ms |
get tp. blocked users: |
2ms |
| others: | 245ms |
| total: | 410ms |

| 0 / 0 |
