显然,答案是:“当你定义文章时,你必须设置@vertical_partition
参数设置为 true,然后添加所需的列sp_articlecolumn
."
不过,我不得不问你为什么要这样做。在我看来,复制并不是在不同数据库之间移动数据的通用工具,而是用于保持两个相同数据库同步的通用工具。
其他集思广益的想法:
- 您可以创建一个与目标表匹配的新源表,并使用触发器来保持源表同步。
- 将源表原封不动地推送到目标数据库,并在目标数据库中执行 MERGE。
- 在这里,复制可能并不是真正正确的解决方案。要求这样做的业务规则和要求是什么?您考虑过使用 SSIS 吗?
- 如果需要两个表始终精确同步,那么源表的更改渠道是什么——应用程序?听起来您的应用程序需要一个新的抽象级别,一个知道如何同时写入两个源的数据写入层。
尝试在两个不同数据库之间保持数据同步可能是一个问题。可能存在各种微妙的问题,例如竞争条件、缺乏分布式事务(影响一致性和对故障的响应)、为处理没有分布式事务而创建的解决方法的问题等等。您是否可以创建一个链接服务器和一些视图,实际上使一个数据库中的数据可以从另一个数据库实时访问?
请告诉我们更多有关您的要求以及为什么需要这样做的信息。
Update
如果您要采用手动更新路线,请注意您无法批量应用某个时间段的插入、更新和删除操作。你必须一次应用它们,in order。如果您正在使用当前状态而不是中间数据操作,那么您可以一次执行所有行。我将向您展示 MERGE 示例,而不是历史回放示例。
BEGIN TRAN;
DELETE D
FROM LinkedServer.dbo.Dest D WITH (TABLOCKX, HOLDLOCK)
WHERE
NOT EXISTS (
SELECT *
FROM Source S
WHERE D.Key = S.Key
);
UPDATE D
SET
D.Col1 = S.Col4,
D.Col2 = S.Col5,
D.Col3 = S.Col6,
D.Col4 = S.Col7,
FROM
LinkedServer.dbo.Dest D
INNER JOIN Source S ON D.Key = S.Key
WHERE
D.Col1 <> S.Col4
OR EXISTS (
SELECT D.Col2, D.Col4
EXCEPT
SELECT S.Col3, S.Col6
); -- or some other way to handle comparison of nullable columns
INSERT LinkedServer.dbo.Dest (Col1, Col2, Col3)
SELECT Col4, Col5, Col6
FROM Source S WITH (TABLOCK, HOLDLOCK)
WHERE
NOT EXISTS (
SELECT *
FROM LinkedServer.dbo.Dest D
WHERE S.Key = D.Key
);
COMMIT TRAN;
您可能会发现推送整个表并在目标服务器上执行合并操作会更好。
如果您想要获得一致的时间点快照,我在第一个查询中添加的锁定提示非常重要。如果您不关心这一点,请去掉锁定提示。
如果您发现链接服务器上的更新速度很慢,请将整个表整体推送到远程服务器上的临时临时表,并完全在远程服务器上的脚本中执行 MERGE。