Только что поборол эту фигню и спешу поделиться информацией (может сохранит кому-то время). Была поставлена задача: "синхронизировать данные клиентов, продуктов и ордеров между OpenERP (PostGre) и главным сайтом компании (MS SQL). Те кто хочет сказать что это извращение, попрошу удалиться. За время работы фрилансером таких извращений насмотрелся, что сейчас удивить практически нечем :)
Изначально предлагалось без проблем создать внешнее приложение, которое подсоединялось бы с определённым интервалом к живой MSSQL базе и проверяло на обновления, и при наличии оных собственно и обновляло. Вариант был отброшен по причине постоянного потока запросов на MSSQL.
Второй вариант предусматривал опять же внешее приложение. В MS SQL создавались триггеры ON INSERT, ON UPDATE, ON DELETE и в триггере вызывалась xp_cmdshell для внешнего приложения! *смайлик бьющегося об стену* Ну Вы поняли что производительность как таковая отсутствует в этом варианте, поэтому перешли к ...
варианту третьему. Всё гениальное просто, были задействованы sp_addlinkedserver, sp_AddLinkedSrvLogin и OPENQUERY. И всё! Ну разве что создал ещё System DSN (LPostGreSQL), но это пустяковая задача. Вот текст подключения, гадеюсь кому-то сохранит время (как минимум день):
EXEC sp_addlinkedserver @server = 'PostGre',
@srvproduct = 'Microsoft OLE DB Provider for ODBC Driver',
@provider = 'MSDASQL', @location = '', @datasrc = 'LPostGreSQL';
EXEC sp_AddLinkedSrvLogin
@rmtsrvname = 'PostGre',
@useself = 'FALSE',
@locallogin = NULL,
@rmtuser = 'postgres',
@rmtpassword = '1';
SELECT * FROM OPENQUERY(PostGre, 'SELECT * FROM res_partner WHERE id<10');
EXEC sp_droplinkedsrvlogin @rmtsrvname='PostGre', @locallogin = NULL;
EXEC sp_DropServer 'PostGre';
@srvproduct = 'Microsoft OLE DB Provider for ODBC Driver',
@provider = 'MSDASQL', @location = '', @datasrc = 'LPostGreSQL';
EXEC sp_AddLinkedSrvLogin
@rmtsrvname = 'PostGre',
@useself = 'FALSE',
@locallogin = NULL,
@rmtuser = 'postgres',
@rmtpassword = '1';
SELECT * FROM OPENQUERY(PostGre, 'SELECT * FROM res_partner WHERE id<10');
EXEC sp_droplinkedsrvlogin @rmtsrvname='PostGre', @locallogin = NULL;
EXEC sp_DropServer 'PostGre';