SymmetricDS — известное программное обеспечение для синхронизации баз данных с поддержкой репликации с несколькими мастерами, синхронизации с фильтрами и преобразования.
При использовании SymmetricDS я чувствовал, что документ не охватывает все возможные варианты использования, а на форуме сообщества также мало информации о встроенной функции.
Что такое фильтры загрузки вSymmetricDS?
Фильтры загрузки — это способ выполнить определенное действие, когда строка данных загружается SymmetricDS в целевом узле базы данных.
Сценарий 1 –
Если у вас есть две таблицы с отношениями внешнего ключа (отношения родитель-потомок), например: -
В некоторых сценариях, если узел SymmetricDS corp отправляет данные таблицы order_items в хранилище, а order_id отсутствует в таблице orders магазина, вы получите ошибку внешнего ключа, и вся партия будет зависать до тех пор, пока вы вручную исправляете проблему.
В этом случае вы просто захотите проигнорировать эту транзакцию, чтобы избежать пакетной ошибки. Load Filter — оптимальный выбор для этой задачи.
Сценарий 2 –
До или после операции вставки/обновления/удаления в строке вам необходимо выполнить какую-либо операцию, например, записать ее в другую таблицу базы данных, выполнить некоторые вычисления с данными, отправить письмо на основе некоторого условия (допустим, цена не указана). правильный диапазон). Load Filter может помочь вам настроить дополнительный уровень бизнес-логики.
Сколько типов фильтров загрузки есть вSymmetricDS?
Существует три типа нагрузочного фильтра: -
- SQL: — SQL-запрос.
- Java: пользовательский код Java, который будет выполняться во время выполнения.
- BSH: код пользовательского скрипта bash.
Все три фильтра нагрузки могут быть применены в любой момент времени, как показано ниже:
- Сценарий перед записью: сценарий, который необходимо выполнить перед записью в базу данных.
- Сценарий после записи: сценарий, который будет выполняться после записи в базу данных.
- Сценарий завершения пакета: сценарий, который будет выполняться после завершения всего пакета.
- Сценарий пакетной фиксации: сценарий, выполняемый после фиксации всего пакета.
- Сценарий пакетного отката: сценарий, который будет выполняться при откате пакета.
- Сценарий обработки ошибок: сценарий, который выполняется, если данные не могут быть обработаны.
Я предоставлю дополнительные пояснения по Как работает фильтр загрузки 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.