经过一番折腾,我成功地安装了正确的ODBC驱动,并成功地在SQL Server 2008上创建了一个链接服务器,通过它我可以从SQL服务器访问我的PostgreSQL数据库。
我正在使用合并语句将PgSQL数据库中的一些表的所有数据复制到SQL Server中,合并语句的形式如下。
with mbRemote as
select
openquery(someLinkedDb,'select * from someTable')
merge into someTable mbLocal
using mbRemote on mbLocal.id=mbRemote.id
when matched
/*edit*/
/*clause below really speeds things up when many rows are unchanged*/
/*can you think of anything else?*/
and not (mbLocal.field1=mbRemote.field1
and mbLocal.field2=mbRemote.field2
and mbLocal.field3=mbRemote.field3
and mbLocal.field4=mbRemote.field4)
/*end edit*/
update
mbLocal.field1=mbRemote.field1,
mbLocal.field2=mbRemote.field2,
mbLocal.field3=mbRemote.field3,
mbLocal.field4=mbRemote.field4
when not matched then
insert
field1,
field2,
field3,
field4
values
mbRemote.id,
mbRemote.field1,
mbRemote.field2,
mbRemote.field3,
mbRemote.field4
WHEN NOT MATCHED BY SOURCE then delete;
在这个语句完成后,本地(SQL Server)副本与远程(PgSQL服务器)完全同步。
关于这种方法有几个问题。
它是理智的吗?
我认为,更新将在本地行的所有字段上运行,而这些字段不一定发生变化。唯一的先决条件是本地和远程的id字段要匹配。有没有一种更细化的方法/方式来约束合并语句,使其只更新实际发生变化的行?