PGHist — История изменений таблиц в PostgreSQL
Более подробно инcтрумент описан на отдельном сайте pghist.org
Инструмент PGHIST ведет историю изменений таблиц и позволяет получить лог(аудит) изменений по строкам, список изменений по полям с указанием пользователя, времени изменения, SQL-запроса, транзакции, другой технической информации и таблицу по состоянию на момент времени в прошлом (версионирование). Для отображения информации в пользовательском интерфейсе возможно определить SQL-выражения для описания изменных строк и полей таблицы, а также переопределить функции названия операции и имени пользователя.
Устройство и принцип работы
PGHIST - это схема с процедурами и общими таблицами: транзакции, SQL-выражения. При включении ведения истории (процедура pghist.hist_enable) для указанной таблицы создаются дополнительная таблица, триггеры на insert,update,delete,truncate, хранимые процедуры и представление получения данных. При изменении таблицы срабатывают триггеры, которые сохраняют старые значения, первичный ключ и ссылку на SQL-выражение в таблицу истории. Также имеются событийные триггеры на DDL-команды, которые перестраивают таблицу истории и пересоздают хранимые процедуры.
Основные функции и представление
pghist.hist_enable([schema],[table]) | - | включение ведения истории |
[schema].[table]_hist | - | лог(аудит) изменений по строкам, оптимизирован для анализа |
[schema].[table]_changes | - | список изменений по полям, оптимизирован для показа пользователю |
[schema].[table]_at_timestamp | - | таблица по состоянию на момент времени (версионирование) |
Более подробно на странице Документация
-- Создаем таблицу create table example( id int primary key, name varchar(20), number numeric(10,2), date date ); -- Включаем ведение истории call pghist.hist_enable('example'); -- Изменяем данные insert into example values (1, 'Пример', 10, current_date); update example set number=20, date=date-1; -- Получаем лог изменений по строкам select * from example_hist; -- Получаем изменения по полям select * from example_changes(); -- Получаем таблицу в прошлом select * from example_at_timestamp(now()-interval '10 second'); -- drop table example cascade;