我有一个服务器和几个客户端,它们的数据库由 Simmetric-DS 同步。现在客户端和服务器的数据库版本是 1.0。因此,对于客户端和服务器,该列node.schema_version
是 1.0。
我可以手动将服务器数据库升级到 rev.2.0。客户端数据库将使用另一个应用程序自行升级到 rev.2.0。
我想用来node.schema_version
避免服务器和版本不同于 2.0 的节点之间的同步。
我使用了一个子选择路由器router_expression
:
'(SELECT check_version(c.schema_version))'
..check_version
如果客户端服务器版本相等,则函数为真,否则引发异常以停止同步:
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
?