假设我有TableA的DatabaseA,它包含以下字段:Id,Name。
在另一个数据库DatabaseB中,我有TableA,它包含以下字段:DatabaseId,Id,Name。
是否可以设置将发送的复制发布:
DatabaseA.dbid,DatabaseA.TableA.Id,DatabaseA.TableA.Name
到DatabaseB.TableA?
编辑: 我问的原因是我需要将多个数据库(具有相同的模式)组合到一个数据库中,并尽可能减少延迟。复制似乎是一个很好的起点(需要将数据从一个地方复制到另一个地方),但我只是处于头脑风暴阶段。我绝对愿意接受有关如何在不使用复制的情况下完成此任务的建议。
答案 0 :(得分:2)
您是在多个来源的某个地方汇总这些活动吗?复制只来自一个来源 - 它是一对一的,因此源ID似乎不太合理。
如果您正在汇总来自多个来源的数据,那么链接服务器和触发器可能是更好的选择,如果是这种情况,那么您绝对可以包含有关所需源的任何信息。
如果你能澄清你的问题来描述目的,那将有助于我们找到最佳解决方案。
问题中的新细节更新:
这个解决方案听起来像是你需要的吗?
您可以根据需要调整检查/合并过程在服务器上运行的频率(甚至可以不断地运行它来处理出现的新行,甚至可能在该表上也使用AFTER触发器。)
答案 1 :(得分: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',
...
重要提示:索引视图的a lot of requirements可能不适合您的应用。例如,每次更新基表时都必须设置某些选项。
(响应您问题中的编辑...)这不适用于将多个源组合到一个表中。 AFAIK,订阅数据库中的对象只能来自一篇已发表的文章。并且您无法在订阅端进行索引视图,因为在索引视图中不允许使用UNION。 (文档没有明确声明UNION ALL是不允许的,但它不会让我感到惊讶。你可以尝试以防万一。)但它仍然会回答你明确的问题:dbid将在复制表中。