Расширение для PostgreSQL, позволяющее хранения историю изменения данных
Скачайте файлы из dist и переместите их в папку extension
приложения PostgreSQL. Для windows папка может располагаться в
C:\Program Files\PostgreSQL\16\share\extension
.
Далее выполните следующие команды.
Создайте новую схему для удобства.
CREATE SCHEMA "history";
ALTER ROLE "postgres" SET search_path TO "public", "history";
Установите расширение.
CREATE EXTENSION "pg_history"
SCHEMA "history"
VERSION '2.0';
Подробнее про расширение и файл control
Если нет возможности добавить расширение в PostgreSQL, то есть другой вариант.
Скопировать в текстовый редактор содержание файлов с расширением .sql
из dist. Заменить выражение @extschema@
на схему,
в которую будет добавлены необходимые функции, например abstract
.
Скопировать в консоль PostgreSQL и запустить.
# | primary_key | dml | has_primary_key_change | data | timestamp |
---|---|---|---|---|---|
1 | {"id": 4} | INSERT | false | {"id": 4, "nickname": "Max", "password": null} | 2022-08-06 12:18:02.613552 |
2 | {"id": 4} | UPDATE | false | {"nickname": "Max N"} | 2022-08-06 12:18:13.486149 |
3 | {"id": 4} | UPDATE | false | {"nickname": "Max NM", "password": null} | 2022-08-06 12:18:20.433618 |
4 | {"id": 4} | UPDATE | true | {"id": 1} | 2022-08-06 12:18:20.433618 |
5 | {"id": 1} | DELETE | false | 2022-08-06 12:18:22.118845 |
Чтобы хранить изменения данных, нужно к таблице добавить триггер trigger_history()
из расширения.
CREATE TRIGGER history
AFTER INSERT OR UPDATE OR DELETE
ON users
FOR EACH ROW
EXECUTE PROCEDURE trigger_history();
-- ИЛИ
CREATE TRIGGER history
AFTER INSERT OR UPDATE OR DELETE
ON users
FOR EACH ROW
EXECUTE PROCEDURE trigger_history('{ password }');
-- ИЛИ
CREATE TRIGGER history
AFTER INSERT OR UPDATE OR DELETE
ON users
FOR EACH ROW
EXECUTE PROCEDURE trigger_history('{ password }', '{ created_at, updated_at }');
Функция trigger_history("hidden_columns" TEXT[] = NULL, "hidden_columns" TEXT = NULL)
, где:
"hidden_columns"
массив колонок, значение которых хранить нельзя;"unsaved_columns"
массив колонок, которых хранить нельзя.
Во время выполнения триггера вызываются функции, которые вы можете переопределить под свои задачи.
get_history_schema_name()
- функция возвращающая схему таблицы для хранения истории изменений. По умолчанию"history"
.get_history_table_name()
- функция возвращающая название таблицы для хранения истории изменений. По умолчанию"public.users__2022_08"
.create_history_table()
- функция создания новой таблицы для хранения истории изменений. По умолчанию каждый месяц создается новая таблица.get_history_data()
- функция возвращающая jsonb объект данных, которые будут храниться в истории изменений. По умолчанию указана функция, которая имеет возможность обнулять колонки ("hidden_columns"
) и удалять колонки ("unsaved_columns"
).
Все функции принимают следующие параметры:
"relid" OID
- таблица, в которой сработал триггер."option" DML
- действие, которое вызвало триггер (INSERT
,UPDATE
,DELETE
)."changed_data" JSONB
- измененные данные таблицы."args" VARIADIC TEXT[]
- аргументы переданные в триггер при создании.
Подробнее с функциями можно ознакомиться в папке ./triggers/helpers.