28 окт. 2009 г.

Связка PostGre SQL и Microsoft SQL

Только что поборол эту фигню и спешу поделиться информацией (может сохранит кому-то время). Была поставлена задача: "синхронизировать данные клиентов, продуктов и ордеров между 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';



Комментариев нет: