假设我有TableA的DatabaseA,它包含以下字段:Id,Name。

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

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

DatabaseA.dbid,DatabaseA.TableA.Id,DatabaseA.TableA.Name

到DatabaseB.TableA?

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

有帮助吗?

解决方案

可能有一种更简单的方法,但我想到的第一件事是将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将在复制表中。

其他提示

您是在多个来源的某个地方汇总这些活动吗?复制只来自一个来源 - 它是一对一的,因此源ID似乎不太合理。

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

如果你能澄清你的问题来描述目的,那将有助于我们找到最佳解决方案。

问题中的新细节更新:

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

  1. 在源数据库上设置AFTER触发器,将任何已更改的行发送到中央存储库数据库,在某种保留表中。这些行可以包括其他列,例如“Source”,“Change type”等。 (用于插入,删除等)。
  2. 某些中央流程会监视表并处理新行(或定期运行 - 可能一次/分钟),将它们合并到中央数据库中
  3. 您可以根据需要调整检查/合并过程在服务器上运行的频率(甚至可以不断地运行它来处理出现的新行,甚至可能在该表上也使用AFTER触发器。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top