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

Работая с БД часто приходится вручную писать 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 скрипт.

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

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

Roadmap

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

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

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

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

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

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

Заключение

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

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

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

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

Комментарии (0)