我有一个要求,即我在两个具有不同名称且具有不同列名的表之间创建复制。是否可以创建此类复制。
server A server B
---------- ----------
Table : Test Table : SUBS
-------------- ---------------
columns A,B,C Columns D,E,F,G,H
我想配置复制,以便将A列数据复制到D列,将B列数据复制到E列,将C列数据复制到F列
答案 0 :(得分:4)
显然,答案是:“在定义文章时,您必须将@vertical_partition
参数设置为true,然后使用sp_articlecolumn
添加所需的列。”
但是,我不得不问你为什么要这样做。在我看来,复制不是在不同数据库之间移动数据的一般工具,而是用于保持两个相同的数据库同步。
其他头脑风暴的想法:
尝试在两个不同的数据库之间保持数据同步可能是个问题。竞争条件,缺乏分布式事务(影响一致性和对故障的响应),为处理没有分布式事务而创建的变通方法的问题等等,可能存在各种微妙的问题。您是否可以创建一个链接服务器和一些实际上使另一个数据库中的数据实时访问的视图?
请告诉我们更多有关您的要求以及您需要执行此操作的原因。
<强>更新强>
如果您要进行手动更新路线注意,则无法集中应用时间段的插入,更新和删除操作。您必须一次应用一个,按顺序。如果您正在使用当前状态而不是中间数据操作,那么您可以一次执行所有行。我将向您展示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。