Отслеживать вносителя изменений таблиц БД..

Здравствуйте уважаемые форумчане.

Работаю в связке Postgresql+Postgis+Qgis. Postgis - есть расширение для Postgresql, для работы с пространственными данными. Qgis собственно сам клиент через который подключаюсь к БД.

Создал пользователей, разграничил права. Все работает на ура. Разумеется надо немного подпилить PostgreSQl.

А именно. Как оказалось очень важно знать кто какие изменения вносил. То есть протоколировать изменения в БД, в частности иметь информацию о том кто какие изменения вносил в таблицы БД. Есть ли возможность реализации данной функции в PostgreSQL.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Вы можете включить подробный

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

Извините. А Вы не подскажите

Извините. А Вы не подскажите как?

День добрый А именно. Как

Изображение Игорь

День добрый


А именно. Как оказалось очень важно знать кто какие изменения вносил. То есть протоколировать изменения в БД, в частности иметь информацию о том кто какие изменения вносил в таблицы БД. Есть ли возможность реализации данной функции в PostgreSQL.
Это называется аудитом. Сделайте таблицу куда будете складывать действия пользователей; сделайте сохраняемые процедуры для insert, update, delete(называет, например, log_insert и т.д.). В процедуре для определения имени пользователя, используйте фунцию - "select session_user;", а для определения ip-адреса с которого используйте функцию - "select inet_client_addr();" потом делайте тригеры(на обновление, вставку, удаление), в которых используйте созданные сохранёные процедуры. Думаю ничего сложного нет, а как получить имя пользователя и его апишник я написал. Как создавать тригеры - в мануалах написано.

Нашел что то схожее с моей

Нашел что то схожее с моей проблемой.. буду пробовать.

С аудитом вроде разобрался..

С аудитом вроде разобрался.. Данная статья помогла.

Помогите пожалуйста для таблицы следующего вида.

CREATE TABLE note
(
  id serial NOT NULL,
  geom geometry(Point,4326),
  note character varying(99),
  remark character varying(99),
  date date

Как для данной таблицы сделать так чтоб при внесении изменений в нее же ( то есть не в аудитную таблицу) сохранялись время создания, юзер вносивший изменения. Целый день старался написать тригер осуществляющий такое, что то не получилось. =((

Прошу направить на верную мысль и если можно хотя бы приближенный пример реализации.

Ладно друзья, объясню

Ладно друзья, объясню поподробнее. Имеется следующее представление

-- View: pg_stat_activity
 
-- DROP VIEW pg_stat_activity;
 
CREATE OR REPLACE VIEW pg_stat_activity AS 
 SELECT s.datid, 
    d.datname, 
    s.pid, 
    s.usesysid, 
    u.rolname AS usename, 
    s.application_name, 
    s.client_addr, 
    s.client_hostname, 
    s.client_port, 
    s.backend_start, 
    s.xact_start, 
    s.query_start, 
    s.state_change, 
    s.waiting, 
    s.state, 
    s.query
   FROM pg_database d, 
    pg_stat_get_activity(NULL::integer) s(datid, pid, usesysid, application_name, state, query, waiting, xact_start, query_start, backend_start, state_change, client_addr, client_hostname, client_port), 
    pg_authid u
  WHERE s.datid = d.oid AND s.usesysid = u.oid;
 
ALTER TABLE pg_stat_activity
  OWNER TO postgres;
GRANT SELECT ON TABLE pg_stat_activity TO public;
REVOKE ALL ON TABLE pg_stat_activity FROM postgres;

Которое выдает таблицу следующего вида

http://fotki.yandex.ru/users/alimuradov05/view/1008572/

В результирующей таблице данного представления мы видим username name, usesysid id значения времени и т.д.
Раз представления их выводит значит эти значения где то хранятся..
Вопрос где??
Другой вопрос как так же реализовать у себя в таблице.
Подскажите новичку. Документацию изучать уже начал, но не хотелось бы чтоб работа стояла из за моей необразованности.

Еще раз но уже по другому..

Есть таблиц.

CREATE TABLE note
(
  id serial NOT NULL,
  geom geometry(Point),
  note character varying(99),
  remark character varying(99),
  created timestamp without time zone,
  created_by character varying(32),
  deleted timestamp without time zone,
  deleted_by character varying(32)
)

сделал тригер на вставку

CREATE OR REPLACE FUNCTION note_insert() RETURNS TRIGGER AS
$$
  BEGIN
    INSERT INTO note
      (id, geom, note, remark, created, created_by)
    VALUES
      (NEW.id, NEW.geom, NEW.note, NEW.remark,
       current_timestamp, current_user);
    RETURN NEW;
  END;
$$
LANGUAGE plpgsql;
 
CREATE TRIGGER note_insert_trigger
AFTER INSERT ON note
    FOR EACH ROW EXECUTE PROCEDURE note_insert();

однако при добавлении объекта выдается ошибка:
Ошибки источника:
Ошибка PostGIS при добавлении объектов: ERROR: stack depth limit exceeded
HINT: Increase the configuration parameter "max_stack_depth" (currently 2048kB), after ensuring the platform's stack depth limit is adequate.
CONTEXT: SQL statement "INSERT INTO note
(id, geom, note, remark, created, created_by)
VALUES
(NEW.id, NEW.geom, NEW.note, NEW.remark,
current_timestamp, current_user)"
PL/pgSQL function note_insert() line 3 at SQL statement
SQL statement "INSERT INTO note
(id, geom, note, remark, created, created_by)
VALUES
(NEW.id, NEW.geom, NEW.note, NEW.remark,
current_timestamp, current_user)"

но почему то

Триггер делайте на Before,

Изображение Игорь

Триггер делайте на Before, тогда ошибки не будет.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023