После долгих хлопот мне удалось установить правильный драйвер ODBC и успешно создать связанный сервер на SQL Server 2008, с помощью которого я могу получить доступ к своей базе данных PostgreSQL с сервера SQL.
Я копирую все данные из некоторых таблиц в базе данных PgSQL в SQL Server, используя операторы слияния, которые имеют следующий вид:
with mbRemote as
(
select
*
from
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*/
then
update
set
mbLocal.field1=mbRemote.field1,
mbLocal.field2=mbRemote.field2,
mbLocal.field3=mbRemote.field3,
mbLocal.field4=mbRemote.field4
when not matched then
insert
(
id,
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-сервер).
Несколько вопросов об этом подходе:
- это нормально?
- мне кажется, что обновление будет выполняться для всех полей в локальных строках, которые не обязательно изменились. Единственным условием является соответствие локального и удаленного полей идентификатора. Есть ли более детальный подход / способ ограничения статического слияния, чтобы обновлять только те строки, которые на самом деле изменены?