У меня есть сервер и несколько клиентов с базами данных, синхронизированными Simmetric-DS. Теперь версия базы данных 1.0 для клиента и сервера. Таким образом, столбец node.schema_version
равен 1,0 для клиентов и сервера.
Я могу вручную обновить базу данных сервера до версии 2.0. Клиентские базы данных автоматически обновятся до версии 2.0 с помощью другого приложения.
Я хочу использовать node.schema_version
, чтобы избежать синхронизации между сервером и узлами с версией, отличной от 2.0.
Я использовал маршрутизатор subselect с этим router_expression
:
'(SELECT check_version(c.schema_version))'
.. где функция check_version
имеет значение true, если версии клиента и сервера совпадают, в противном случае вызывает исключение для остановки синхронизации:
CREATE OR REPLACE FUNCTION check_version(v_ver_check text)
RETURNS boolean AS
$BODY$
DECLARE
v_ver_cur text;
v_success boolean;
BEGIN
v_success:=false;
v_ver_cur:='';
SELECT n.schema_version
FROM sym_node n
INNER JOIN sym_node_identity ni on n.node_id=ni.node_id
INTO v_ver_cur;
IF v_ver_cur=v_ver_check
THEN
v_success:=true;
ELSE
RAISE EXCEPTION 'SERVER-DB-VERSION<>CLIENT-DB-VERSION';
END IF;
RETURN v_success;
END;
$BODY$
LANGUAGE plpgsql VOLATILE STRICT
COST 1;
В случае несоответствия версии:
Во время загрузки данных с клиента на сервер:
Этот подход работает нормально, поскольку исключение блокирует процесс синхронизации ТОЛЬКО на клиенте.Во время загрузки данных с сервера на клиент: Исключение блокирует процесс синхронизации НА СЕРВЕРЕ, поэтому синхронизация блокируется для ВСЕХ клиентов.
Как я могу заблокировать процесс загрузки только против узла с version=1.0
?