对称DS架构版本控制

时间:2015-04-10 15:44:18

标签: postgresql plpgsql symmetricds

我有一台服务器,很少有客户端使用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的节点?

2 个答案:

答案 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_nodesym_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
)