Как стать автором
Поиск
Написать публикацию
Обновить

HistoryHelper — плагин для DBeaver, который генерирует history-таблицы и триггеры за пару кликов

Уровень сложностиПростой
Время на прочтение4 мин
Количество просмотров6.7K

Зачем и почему?

Работая с БД часто приходится вручную писать SQL для создания history-таблиц, которые хранят "историю" о каждой записи из таблицы. То есть, если запись создана/изменена/удалена, для неё создается новая запись в таблице с окончанием "_hist" или "_history".

Задача знакомая, но крайне рутинная: для каждой таблицы нужно вручную писать SQL, проверять, чтобы все колонки были учтены, тип колонок был корректным, и не было опечаток.

Поэтому, я решил сделать небольшой плагин для DBeaver, который предоставляет удобное меню выбора колонок и событий.

После нескольких выходных дней получилась минимальная реализация, которой хочу с вами поделиться.

В данный момент реализован самый простой функционал:

  1. Указать колонки, которые будут логироваться

  2. Выбрать события (INSERT, UPDATE, DELETE)

  3. Генерация и применение SQL для выбранной таблицы

Репозиторий проекта: GitHub - HistoryHelper

Кратко про установку

Для установки плагина нужно сделать несколько простых шагов:

  1. Иметь установленный DBeaver

  2. Зайти в репозиторий проекта и перейти в Release1.1.0

  3. Скачать JAR файл (либо собрать из исходников. Инструкция в readme)

  4. Перенести полученный JAR файл в папку /plugins/ (предпочтительнее) или /dropins/

  5. Перезапустить DBeaver с флагами -clean -clearPersistedState

После перезапуска DBeaver, можно проверить, открыв в меню Справка выбрать пункт Информация об установке (см. скриншот ниже).

Скриншот: перейти по пути Справка -> Информация об установке
Скриншот: перейти по пути Справка -> Информация об установке

Затем в панели выбрать пункт Плагины и написать название плагина "HistoryHelper" (см. скриншот ниже).

Скриншот: Плагины - ввести название плагина, для проверки корректности установки
Скриншот: Плагины - ввести название плагина, для проверки корректности установки

Если после всех выполненных шагов установки, в плагинах вы смогли найти HistoryHelper, значит мы можем переходить непосредственно к генерации SQL для history-таблицы.

Использование плагина

Порядок действий будет представлен вместе со скриншотами для наглядности.

1. Необходимо выбрать нужную таблицу и кликнуть правой кнопкой мыши (работает только для таблиц) (см. скриншот ниже).

Скриншот: выбор таблицы
Скриншот: выбор таблицы

2. Нужно кликнуть на «Generate History Table». У вас выпадет диалоговое окно, где вам необходимо выбрать нужные колонки и также события (см. скриншот ниже).

Скриншот: диалоговое окно для выбора нужных колонок и событий (триггеров)
Скриншот: диалоговое окно для выбора нужных колонок и событий (триггеров)

3.При клике на «ОК» у вас выпадет меню, в котором вы увидите сгенерированный SQL и сможете сделать действия (см. скриншот ниже):

  1. Кнопка «Применить» применяет сгенерированный SQL к выбранной таблице, затем также копирует скрипт в буфер обмена (заложил функцию для проектов, использующих liquibase)

  2. Кнопка «Копировать» просто копирует сгенерированный SQL в буфер обмена

  3. Кнопка «Закрыть» если что‑то вас смутило, и вы не хотите использовать сгенерированный SQL

Скриншот: сгенерированный SQL скрипт.
Скриншот: сгенерированный SQL скрипт.
Сгенерированный sql скрипт
CREATE TABLE IF NOT EXISTS test_table_hist 
(id int4 NOT NULL,
name varchar,
epk_id int8,
short_name varchar,
deleted_at timestamp,
created_at timestamp,
modified_at timestamp);

--trigger on insert
CREATE OR REPLACE FUNCTION test_table_ins()
RETURNS TRIGGER AS $$
BEGIN  
	INSERT INTO test_table_hist (id,name,epk_id,short_name,deleted_at,created_at,modified_at) 
	VALUES (NEW.id,NEW.name,NEW.epk_id,NEW.short_name,NEW.deleted_at,NEW.created_at,NEW.modified_at); 
	RETURN NEW;
END;
$$ LANGUAGE PLPGSQL;

CREATE OR REPLACE TRIGGER test_table_hist_ins
AFTER INSERT ON test_table
FOR EACH ROW
EXECUTE FUNCTION test_table_ins();

--trigger on update
CREATE OR REPLACE FUNCTION test_table_upd()
RETURNS TRIGGER AS $$
BEGIN  
	INSERT INTO test_table_hist (id,name,epk_id,short_name,deleted_at,created_at,modified_at) 
	VALUES (NEW.id,NEW.name,NEW.epk_id,NEW.short_name,NEW.deleted_at,NEW.created_at,NEW.modified_at); 
	RETURN NEW;
END;
$$ LANGUAGE PLPGSQL;

CREATE OR REPLACE TRIGGER test_table_hist_upd
AFTER UPDATE ON test_table
FOR EACH ROW
EXECUTE FUNCTION test_table_upd();

--trigger on delete
CREATE OR REPLACE FUNCTION test_table_del()
RETURNS TRIGGER AS $$
BEGIN  
	INSERT INTO test_table_hist (id,name,epk_id,short_name,deleted_at,created_at,modified_at) 
	VALUES (OLD.id,OLD.name,OLD.epk_id,OLD.short_name,OLD.deleted_at,OLD.created_at,OLD.modified_at); 
	RETURN OLD;
END;
$$ LANGUAGE PLPGSQL;

CREATE OR REPLACE TRIGGER test_table_hist_del
AFTER DELETE ON test_table
FOR EACH ROW
EXECUTE FUNCTION test_table_del();

4.После применения сгенерированного SQL (и refresh в бд), вы сможете увидеть таблицу и триггеры.

Скриншот: результат работы плагина.
Скриншот: результат работы плагина.

Roadmap

В ближайшем будущем планирую продолжать улучшать плагин, и, пока что, ближайшие улучшения такие:

  1. Доп. вариант "оптимизированное" хранение в history-таблицах. В отличии от текущей реализации, в "оптимизированном" хранении будет записывать только предпоследние состояние объекта, а не все предыдущие состояния. Необходимо для экономии ресурсов.

  2. Поддержка других СУБД (MySql, Oracle и т.д.) - в данный момент реализация подходит только для PostgreSQL.

  3. Локализация на английский язык.

  4. Добавление ограничений на выпадающее меню: в данный момент при клике на любую папку, базу данных и т.п. - вы увидите "Generate History Table", но при нажатии будет выведено предупреждение "Выберите таблицу в навигаторе БД".

  5. Добавление предупреждений при исключительных сценариях (создания history-таблицы на уже созданную history-таблицу и т.п.)

Заключение

Это мой первый опыт написания плагина для DBeaver и, вообще, первая публичная статья. Понимаю, что плагин пока еще сыроват, но в ближайшем будущем планирую довести его до ума, чтобы облегчить нашу с вами рутину.

Если заметите баги или у вас появятся идеи для улучшений - добро пожаловать в Issues.

Комментарий или звездочка на GitHub будет самой лучшей поддержкой. Не судите строго :)

Ссылка на репозиторий: GitHub - HistoryHelper

Теги:
Хабы:
+14
Комментарии21

Публикации

Ближайшие события