0

我有一个服务器和几个客户端,它们的数据库由 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

4

2 回答 2

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_identitynode_id

于 2015-04-15T18:23:45.390 回答
0

Sym_node_identity 将只有一行表示连接到给定数据库的节点 ID,因此不需要 where 子句来连接 sym_node 中的单行。Sym_node 将表示当前节点与之通信的节点。

但是我认为您可以一起摆脱 check_version 函数,并直接在路由器表达式中使用以下查询。子选择路由器表达式将此附加到 where 子句以确定它应该将数据路由到哪些节点列表。在这种情况下,您将获得您自己的节点的版本 (sym_node_identity),并获得 sym_node 中具有匹配版本的所有其他 node_id。请注意,这只允许您只同步匹配的版本,如果您希望 1 与 2 同步,则可以在最里面的查询中使用 >= 而不是 =,但反之则不行。

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
)
于 2015-04-21T12:19:29.217 回答