SymmetricDS — известное программное обеспечение для синхронизации баз данных с поддержкой репликации с несколькими мастерами, синхронизации с фильтрами и преобразования.

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

Что такое фильтры загрузки вSymmetricDS?

Фильтры загрузки — это способ выполнить определенное действие, когда строка данных загружается SymmetricDS в целевом узле базы данных.

Сценарий 1 – 

Если у вас есть две таблицы с отношениями внешнего ключа (отношения родитель-потомок), например: -

В некоторых сценариях, если узел SymmetricDS corp отправляет данные таблицы order_items в хранилище, а order_id отсутствует в таблице orders магазина, вы получите ошибку внешнего ключа, и вся партия будет зависать до тех пор, пока вы вручную исправляете проблему.

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

Сценарий 2 – 

До или после операции вставки/обновления/удаления в строке вам необходимо выполнить какую-либо операцию, например, записать ее в другую таблицу базы данных, выполнить некоторые вычисления с данными, отправить письмо на основе некоторого условия (допустим, цена не указана). правильный диапазон). Load Filter может помочь вам настроить дополнительный уровень бизнес-логики.

Сколько типов фильтров загрузки есть вSymmetricDS?

Существует три типа нагрузочного фильтра: -

  1. SQL: — SQL-запрос.
  2. Java: пользовательский код Java, который будет выполняться во время выполнения.
  3. BSH: код пользовательского скрипта bash.

Все три фильтра нагрузки могут быть применены в любой момент времени, как показано ниже:

  1. Сценарий перед записью: сценарий, который необходимо выполнить перед записью в базу данных.
  2. Сценарий после записи: сценарий, который будет выполняться после записи в базу данных.
  3. Сценарий завершения пакета: сценарий, который будет выполняться после завершения всего пакета.
  4. Сценарий пакетной фиксации: сценарий, выполняемый после фиксации всего пакета.
  5. Сценарий пакетного отката: сценарий, который будет выполняться при откате пакета.
  6. Сценарий обработки ошибок: сценарий, который выполняется, если данные не могут быть обработаны.

Я предоставлю дополнительные пояснения по Как работает фильтр загрузки SQL?

Load Filter может выполнять любую задачу, он может возвращать или не возвращать выходные данные. Он может возвращать true/false в качестве вывода скрипта. Выходное значение по умолчанию — true.

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

Вариант использования 2 (объяснено выше): выходная переменная не имеет значения, поскольку ее основное назначение – выполнить расчет бизнес-кейса, отправить письмо и т. д.

Давайте настроим Сценарий использования 1: –

скажем, узел обрезки отправляет следующие данные в узел хранения для таблицы order_items :

order_id,product_id,количество

125,20,1

Если order_id = 125 отсутствует в таблице заказов, вы хотите пропустить вставку этих данных в таблицу order_items.

Следующий запрос вернет 0 или 1, если в таблице заказов есть идентификатор заказа = 125 или нет.

SELECT CAST(CASE WHEN COUNT(*) › 0 THEN 1 ELSE 0 END AS BIT)
FROM order WHERE id = 125;

Если вывод равен 1, данные будут вставлены в таблицу.

Если вывод равен 0, данные не будут вставлены в таблицу.

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

ниже приведен весь запрос для создания фильтра нагрузки в SymmetricDS: -

INSERT INTO sym_load_filter
(load_filter_id, load_filter_type, source_node_group_id, target_node_group_id, target_catalog_name, target_schema_name, target_table_name, filter_on_update, filter_on_insert, filter_on_delete, before_write_script, after_write_script, batch_complete_script, batch_commit_script, batch_rollback_script, handle_error_script, create_time, last_update_by, LAST_UPDATE_TIME, load_filter_order , fail_on_error)
VALUES('orderitemfilter1', 'SQL', 'сервер', 'клиент', NULL, NULL, 'order_items', 1, 1, 1, 'SELECT CAST( CASE WHEN COUNT(*) › 0 THEN 1 ELSE 0 END AS BIT)
FROM orders WHERE id = &order_id)', NULL, NULL, NULL, NULL, NULL, '2019–07 –31 09:46:10.963', 'admin', '2019–07–31 23:54:45.427', 1, 1);

Чтобы использовать параметр, используйте символ «&» с именем столбца как &order_id.

Параметр может быть новым/значением следующего столбца или существующим/текущим значением столбца. Если вы хотите использовать существующие данные, параметр будет &old_order_id.

Использование фильтра загрузки SQL является самым простым среди двух других. Но если вам нужна дополнительная функция, вам нужно использовать фильтр загрузки JAVA/BSH.