服务器 频道

在DB2 UDB中复制空间数据(中篇)

  【IT168 服务器学院】 清单 5. Capture 进程设置测试
 
INSERT
INTO   streets(id, name, track)
VALUES (1, ''my first street'',
   db2gse.ST_LineString (''linestring(10 10, 20 20)'', 1))@
SELECT id, VARCHAR(name, 20), wkb FROM cdstreets_repl_view@
ID          2                    WKB
----------- -------------------- ---
          1 my first street      -
  1 record(s) selected.

UPDATE streets
SET    name = ''different street''
WHERE  id = 1@
SELECT id, VARCHAR(name, 20), track_update FROM cdstreets@
ID          2                    TRACK_UPDATE
----------- -------------------- ------------
          1 my first street      -
          1 different street     -
  2 record(s) selected.

UPDATE streets
SET    (id, track) = ( 2, db2gse.ST_LineString(
          ''linestring (5 10, 5 20)'', 1) )
WHERE  id = 1@
SELECT id, VARCHAR(name, 20), track_update FROM cdstreets@
ID          2                    TRACK_UPDATE
----------- -------------------- ------------
          1 my first street      -
          1 different street     -
          2 different street     U
  3 record(s) selected.

  将视图注册为复制源

  启动 capture 进程之前的最后一步操作是将视图 STREETS_REPL_VIEW 注册为复制源。然后,可将该视图用于订阅组中。这张视图中包含着以已知二进制格式编码的空间数据。

  不幸的是,该视图并不能用 DB2 Replication Center 进行注册。复制工具会根据这张视图基于的所有表的 CD 表创建变化数据视图(CD 视图)。所有对该 CD 视图的引用必须找到对应的目标 CD 表。在我们的例子中,这就意味着如下的事实。CD 表中包含 ID、NAME 以及 TRACK_UPDATE 等字段。它并不包含 TRACK 字段,因为前面解释过,这个字段并不能注册。视图 STREET_REPL_VIEW 从表 STREETS 中引用 ID、NAME 和 TRACK 字段。相应的 CD 视图就必须引用 CD 表中相同的字段。 图7描述了这些依赖关系。

  图 7. 视图、表、CD 视图及 CD 表之间的依赖关系

 

  复制工具分析 STREETS_REPL_VIEW 的视图定义,发现字段 TRACK 是 ST_AsBinary() 函数的输入。但是,CD 表中没有相应的字段 TRACK,因此,CD 视图无法创建。您将看到如 图8所示的错误消息。

  图 8. 将 STREETS_REPL_SOURCE 注册为复制源的出错消息

 

  除了我已经说过的 CD 表中不存在 TRACK 字段的问题之外,我们还需要处理另外一个问题。最终得到的 CD 视图不应该包含 BLOB 字段(这个字段是 ST_AsBinary(TRACK) 这个函数调用的结果),而是应该包含更新指示器字段 TRACK_UPDATE。更新指示器已经存在于 CD 表中,所以这个依赖关系可以很轻易地满足。

  为了按照要求创建 CD 视图,我们现在要使用一个哑视图,它的基础表是 STREETS。 创建这张视图时应该包括 TRACK_UPDATE 字段,而不包括 TRACK 字段。而这个字段与 STREETS_REPL_VIEW 中经过转换以后的 TRACK 字段名字相同,即 WKB。 清单6是相应的 CREATE VIEW 语句。

清单 6. 创建包含更新指示器的哑视图

CREATE VIEW spatial_replication_dummy(id, name, wkb) AS
   SELECT t.id, t.name, t.track_update
   FROM   stolze.streets AS t@

  如 图9所示,注册这张视图的方法很简单。在注册过程中,我们也要给这张 CD 视图取一个更加恰当的名字。

  图 9. 注册哑视图

 

  用这种方法生成 SQL 语句非常简单,不会产生任何错误或者警告消息。您也可以就这样执行这些 SQL 语句。但是这个哑视图并不是我们实际想要复制的视图。因此,必须在复制目录表中修正该视图的名称。目录表 IBMSNAP_REGISTER 中的 SOURCE_OWNER 和 SOURCE_TABLE 包含了完全限定的表名。我们需要对这部分数据进行调整,令其指向视图 STREETS_REPL_VIEW。 清单7显示了当哑视图注册为复制源之后 IBMSNAP_REGISTER 表中的内容。

清单 7. IBMSNAP_REGISTER 目录表中的内容

SELECT source_owner, source_table FROM asn.ibmsnap_register@
SOURCE_OWNER    SOURCE_TABLE
--------------- -----------------------------
STOLZE          SPATIAL_REPLICATION_DUMMY
STOLZE          STREETS

  对这一项进行修改也是很简单的。您使用一条 UPDATE 语句就能实现必要的修正工作。当您修改完成之后,您可以将这张哑视图删除,因为已经不再需要它了。 清单8阐明了这两个步骤。

清单 8. 修正复制目录信息并清除哑视图
 
UPDATE asn.ibmsnap_register
SET    ( source_owner, source_table ) =
          ( ''STOLZE'', ''STREETS_REPL_VIEW'' )
WHERE  source_table = ''SPATIAL_REPLICATION_DUMMY''@
DROP VIEW spatial_replication_dummy@

  最后一步,您可以在 DB2 Replication Center 中双击正确的视图注册项。选中“Registered Views”,您就可以看到 STREETS_REPL_VIEW,如 图10所示。

  图 10. 验证已经注册的视图

 

  成功注册视图之后,您现在可以定义那些将视图作为复制源的订阅成员了,数据可以通过视图复制到不同数据库的目标表中。对目标表的设置将在下面几节中详细解释。

0
相关文章