2

假设我有带有 TableA 的 DatabaseA,它具有以下字段:Id、Name。

在另一个数据库 DatabaseB 中,我有 TableA,其中包含以下字段:DatabaseId、Id、Name。

是否可以设置将发送的复制发布:

DatabaseA.dbid、DatabaseA.TableA.Id、DatabaseA.TableA.Name

到DatabaseB.TableA?

编辑:我要问的原因是我需要将多个数据库(具有相同的模式)组合到一个数据库中,并尽可能减少延迟。复制似乎是一个不错的起点(需要将数据从一个地方复制到另一个地方),但我正处于头脑风暴阶段。我肯定会接受有关如何在不使用复制的情况下完成此任务的建议。

4

2 回答 2

2

您是否将来自多个来源的这些事件汇总到一个地方?复制只来自一个来源——它是一对一的,所以来源 ID 似乎没有多大意义。

如果您正在聚合来自多个来源的数据,那么链接服务器和触发器可能是更好的选择,如果是这种情况,那么您绝对可以包含有关您想要的来源的任何信息。

如果您可以澄清您的问题以描述目的,这将有助于我们找到最佳解决方案。

从问题的新细节更新:

这个解决方案听起来像是您需要的吗?

  1. 在源数据库上设置 AFTER 触发器,将任何更改的行发送到中央存储库数据库,在某种保存表中。这些行可以包括其他列,例如“源”、“更改类型”(用于插入、删除等)。
  2. 一些中央进程监视表并处理新行(或定期运行 - 也许每分钟一次),将它们合并到中央数据库中

您可以根据需要调整检查/合并过程在服务器上运行的频率(甚至不断运行它以处理出现的新行,甚至可能在该表上使用 AFTER 触发器)。

于 2009-01-07T19:39:21.730 回答
2

可能有更简单的方法,但我想到的第一件事是将 TableA 包装在源数据库上的索引视图中,然后将视图复制为表(即 type = "indexed view logbased")。不过,我认为这不适用于合并复制。

所以,大概是这样的:

CREATE VIEW TableA_with_dbid WITH SCHEMABINDING AS
SELECT DatabaseA.dbid, Id, Name FROM TableA

CREATE UNIQUE CLUSTERED INDEX ON TableA_with_dbid (Id) -- or whatever your PK is

EXEC sp_addarticle ...,
    @source_object = 'TableA_with_dbid',
    @destination_table = 'TableA',
    @type = 'indexed view logbased',
    ...

大警告:索引视图有很多可能不适合您的应用程序的要求。例如,每次更新基表时都必须设置某些选项。

(响应您问题中的编辑......)这不适用于将多个来源组合到一个表中。AFAIK,订阅数据库中的对象只能来自一篇已发表的文章。而且您不能在订阅端进行索引视图,因为在索引视图中不允许使用 UNION。(文档没有明确声明 UNION ALL 是不允许的,但这不会让我感到惊讶。您可以尝试以防万一。)但它仍然回答了您的明确问题:dbid 将在复制表中。

于 2009-01-07T19:51:23.793 回答