Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / PostgreSQL Новый топик    Ответить
 Собрать максимально информацию в триггере.  [new]
камаз5320
Member

Откуда:
Сообщений: 35
Привет, нужно собирать инфу по изменению таблицы.

И собрать максимальную информацию, кто изменил, какое приложение, какой ip и тп...

Подскажите пожалуйста как эту информацию (кто изменил, какое приложение, какой ip и тп) добыть.
1 июн 17, 13:12    [20531085]     Ответить | Цитировать Сообщить модератору
 Re: Собрать максимально информацию в триггере.  [new]
камаз5320
Member

Откуда:
Сообщений: 35
Ну и в принципе возможно ли это?

В мс скл возможно, например.
1 июн 17, 13:21    [20531124]     Ответить | Цитировать Сообщить модератору
 Re: Собрать максимально информацию в триггере.  [new]
камаз5320
Member

Откуда:
Сообщений: 35
пока не нашел как это сделать
1 июн 17, 13:40    [20531176]     Ответить | Цитировать Сообщить модератору
 Re: Собрать максимально информацию в триггере.  [new]
камаз5320
Member

Откуда:
Сообщений: 35
Только это нашел:

+
When a PL/pgSQL function is called as a trigger, several special variables are created automatically in the top-level block. They are:

NEW

Data type RECORD; variable holding the new database row for INSERT/UPDATE operations in row-level triggers. This variable is NULL in statement-level triggers.
OLD

Data type RECORD; variable holding the old database row for UPDATE/DELETE operations in row-level triggers. This variable is NULL in statement-level triggers.
TG_NAME

Data type name; variable that contains the name of the trigger actually fired.
TG_WHEN

Data type text; a string of either BEFORE or AFTER depending on the trigger's definition.
TG_LEVEL

Data type text; a string of either ROW or STATEMENT depending on the trigger's definition.
TG_OP

Data type text; a string of INSERT, UPDATE, or DELETE telling for which operation the trigger was fired.
TG_RELID

Data type oid; the object ID of the table that caused the trigger invocation.
TG_RELNAME

Data type name; the name of the table that caused the trigger invocation.
TG_NARGS

Data type integer; the number of arguments given to the trigger procedure in the CREATE TRIGGER statement.
TG_ARGV[]

Data type array of text; the arguments from the CREATE TRIGGER statement. The index counts from 0. Invalid indices (less than 0 or greater than or equal to tg_nargs) result in a null value.




Но это не то.
1 июн 17, 13:56    [20531265]     Ответить | Цитировать Сообщить модератору
 Re: Собрать максимально информацию в триггере.  [new]
камаз5320
Member

Откуда:
Сообщений: 35
Неужели постгрес так не может делать? :(
1 июн 17, 14:38    [20531516]     Ответить | Цитировать Сообщить модератору
 Re: Собрать максимально информацию в триггере.  [new]
LeXa NalBat
Member

Откуда: Москва
Сообщений: 2887
https://www.postgresql.org/docs/9.6/static/functions-info.html
1 июн 17, 14:46    [20531557]     Ответить | Цитировать Сообщить модератору
 Re: Собрать максимально информацию в триггере.  [new]
камаз5320
Member

Откуда:
Сообщений: 35
LeXa NalBat
https://www.postgresql.org/docs/9.6/static/functions-info.html


Спасибо.
1 июн 17, 16:43    [20532178]     Ответить | Цитировать Сообщить модератору
 Re: Собрать максимально информацию в триггере.  [new]
камаз5320
Member

Откуда:
Сообщений: 35
LeXa NalBat,

Скажите, в триггере SELECT inet_client_addr() должен вернуть адрес того, кто изменяет стороки?



Просто у меня в пг-админе не пойму что он возвращает, не мой IP точно.
1 июн 17, 16:44    [20532186]     Ответить | Цитировать Сообщить модератору
 Re: Собрать максимально информацию в триггере.  [new]
камаз5320
Member

Откуда:
Сообщений: 35
Ну и приложение очень хочется отловить триггером.
1 июн 17, 16:45    [20532190]     Ответить | Цитировать Сообщить модератору
 Re: Собрать максимально информацию в триггере.  [new]
камаз5320
Member

Откуда:
Сообщений: 35
Что-то никак не найду как запросом получить название клиентского приложения

Постгре 8
1 июн 17, 17:07    [20532287]     Ответить | Цитировать Сообщить модератору
 Re: Собрать максимально информацию в триггере.  [new]
Павел Лузанов
Member

Откуда:
Сообщений: 498
камаз5320,

select current_setting('application_name');

Чтобы это работало, клиентское приложение при старте должно выставить:
set application_name = 'имя приложения';
1 июн 17, 17:10    [20532305]     Ответить | Цитировать Сообщить модератору
 Re: Собрать максимально информацию в триггере.  [new]
камаз5320
Member

Откуда:
Сообщений: 35
Павел Лузанов
камаз5320,

select current_setting('application_name');

Чтобы это работало, клиентское приложение при старте должно выставить:
set application_name = 'имя приложения';


Спасибо!

В 9.5 работает нормально.



Однако в 8-й версии:

ERROR:  unrecognized configuration parameter "application_name"
********** Ошибка **********

ERROR: unrecognized configuration parameter "application_name"
SQL-состояние: 42704




Как бы в 8-й версии отловить его?...
1 июн 17, 17:14    [20532329]     Ответить | Цитировать Сообщить модератору
 Re: Собрать максимально информацию в триггере.  [new]
Павел Лузанов
Member

Откуда:
Сообщений: 498
камаз5320,

Ну сделайте пользовательский параметр (должна быть точка в имени):
set myapp.name = 'имя приложения';
select current_setting('myapp.name');
1 июн 17, 17:20    [20532368]     Ответить | Цитировать Сообщить модератору
 Re: Собрать максимально информацию в триггере.  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 3724
камаз5320
Павел Лузанов
камаз5320,

select current_setting('application_name');

Чтобы это работало, клиентское приложение при старте должно выставить:
set application_name = 'имя приложения';


Спасибо!

В 9.5 работает нормально.



Однако в 8-й версии:

ERROR:  unrecognized configuration parameter "application_name"
********** Ошибка **********

ERROR: unrecognized configuration parameter "application_name"
SQL-состояние: 42704




Как бы в 8-й версии отловить его?...



1)в 8 версии такого параметра нет
2)если приложение у вас не самописное то 99% что "application_name" оно не ставит (и без переписывания ставить не будет).
(т.е. параметр на новых версиях то есть но если ПРИЛОЖЕНИЕ его не ставит - толку ноль).
1 июн 17, 17:21    [20532378]     Ответить | Цитировать Сообщить модератору
 Re: Собрать максимально информацию в триггере.  [new]
камаз5320
Member

Откуда:
Сообщений: 35
Maxim Boguk
камаз5320
пропущено...


Спасибо!

В 9.5 работает нормально.



Однако в 8-й версии:

ERROR:  unrecognized configuration parameter "application_name"
********** Ошибка **********

ERROR: unrecognized configuration parameter "application_name"
SQL-состояние: 42704






Как бы в 8-й версии отловить его?...



1)в 8 версии такого параметра нет
2)если приложение у вас не самописное то 99% что "application_name" оно не ставит (и без переписывания ставить не будет).
(т.е. параметр на новых версиях то есть но если ПРИЛОЖЕНИЕ его не ставит - толку ноль).






Получается

select current_setting('application_name');

Просто берет информацию из:
SELECT * FROM pg_settings WHERE name='application_name'






А на 8-ке в принципе нельзя имя приложения в триггер записать?
1 июн 17, 17:23    [20532387]     Ответить | Цитировать Сообщить модератору
 Re: Собрать максимально информацию в триггере.  [new]
Maxim Boguk
Member

Откуда: Melbourne, Австралия
Сообщений: 3724
камаз5320
А на 8-ке в принципе нельзя имя приложения в триггер записать?


Последняя 8рка (8.4) EOL 3 года назад!!!! ( July 2014)
Если вам нечего делать - возьмите исходники и внесите туда поддержку application_name из новых версий.

--
Maxim Boguk
dataegret.ru
2 июн 17, 10:21    [20533716]     Ответить | Цитировать Сообщить модератору
Все форумы / PostgreSQL Ответить