我有一台服务器,很少有客户端使用Simmetric-DS同步数据库。
现在,客户端和服务器的数据库版本为1.0。因此,对于客户端和服务器,列node.schema_version
为1.0。
我可以手动将服务器数据库升级到rev.2.0。客户端数据库将使用其他应用程序自行升级到rev.2.0。
我想使用node.schema_version
来避免同步
服务器和版本不同于2.0的节点。
我使用了 subselect 路由器和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
的节点?
答案 0 :(得分:0)
不确定我理解这个问题。在任何一种情况下,您都可以简化plpgsql函数:
CREATE OR REPLACE FUNCTION check_version(v_ver_check text)
RETURNS boolean AS
$BODY$
BEGIN
IF EXISTS (
SELECT 1
FROM sym_node n
JOIN sym_node_identity ni USING (node_id)
WHERE n.schema_version = v_ver_check
) THEN
RETURN true;
ELSE
RAISE EXCEPTION 'SERVER-DB-VERSION <> CLIENT-DB-VERSION';
END IF;
END
$func$ LANGUAGE plpgsql STRICT;
这里有一些猜测。有关涉及的表格的必要信息不在问题中。
我想知道为什么WHERE
上没有sym_node_identity
条件? sym_node
和sym_node_identity
仅在node_id
上匹配一行行吗?
答案 1 :(得分:0)
Sym_node_identity只有一行代表连接到给定数据库的节点ID,因此在sym_node中没有连接到单行所需的where子句。 Sym_node将表示当前节点与之通信的节点。
但是我认为你可以一起摆脱check_version函数并直接在路由器表达式中使用以下查询。子选择路由器表达式将此附加到where子句,以确定应将数据路由到哪些节点列表。在这种情况下,您将获得自己的节点版本(sym_node_identity),并获取sym_node中具有匹配版本的所有其他node_id。请注意,这只允许您同步匹配版本,如果您希望1与2同步,则可以在最里面的查询中执行&gt; =而不是= =但不是相反
c.node_id in (
select node_id
from sym_node sn1
join (
select schema_version
from sym_node sn2
join sym_node_identity si on si.node_id = sn2.node_id
) sv on sv.schema_version = sn1.schema_version
)