среда, 4 января 2012 г.

Linked Server (связанный сервер) к Mysql - проще простого


  Современные  системы  часто взаимодействуют с другими системами, БД, одна из которых MySql. Попробую описать подключение через Linked Server к MySql, хотя это довольно просто.



Для настройки подключения из MS SQL Server к СУБД MySQL необходимо настроить «Linked Server» к серверу Mysql.
Для этого необходимо на сервере, где установлен MS SQL Server, настроить источник данных к Mysql.  Скачиваем  с сайта Mysql и устанавливаем  драйвера ODBC Mysql, к примеру mysql-connector-odbc-5.1.8-win32.msi, там ничего сложного нет, все по умолчанию.

После установки заходим в «Администрирование (AdministrativeTools)»-> «Источники Данных ODBC (DataSource (ODBС))»->«Системный DSN (SystemDSN)»->«Добавить (Add
В списке драйверов должен присутствовать установленный драйвер «MySQLODBС  5.1 Driver», если его нет, то проблема с установкой драйвера.
Далее устанавливаем стандартные настройки сервера Mysql:
DataSourceName – имя DSN подключения, произвольное, в дальнейшем мы будеv его использовать в настройках подключения в MS SQL Server.
TCP/ IP ServerIP сервера MySql или его DNS имя
Port –порт подключения к Mysql, стандартный 3306
User и Password – имя пользователя в БД Mysql и его пароль.
Databases – имя БД по умолчанию при подключение, можно его не указывать.
После указания данных параметров, проверяем настройки «Test» и сохраняем  подключение.
После того как создали ODBC подключение в ОС, необходимо настроить Linked Server в MS SQL Server.

Создаем новый LinkServer:

Имя связанного сервера – задаем имя cвязанного сервера, будем использоваться его в дальнейшем в запросах.
Название продукта и Источник данных – имя нашего настроенного ODBCподключения.
Нажимаем «ОК», если все создали правильно, то создание связанного сервера закончится без ошибок, иначе будет ошибка, в том числе и не на неправильный пароль к MySql или отсутствие доступа к БД.

После этого можно запускать запросы к Mysql через Openquery
  select*from openquery(mysql,'select id from groups')
Какая здесь может быть проблема в данных запросах? Это наличие одних типов данных Mysql и их отсутствие в MS SQL server-е. Текст ошибки будет таков, как например на такой запрос:
  select*from openquery(mysql,'select * from projects')
 Для решения данной проблемы необходимо использовать преобразование типов на строне mysql, либо отказаться в использование данных столбцов в запросах
  select*from openquery(mysql,'select id from projects')

это запрос уже сработает:
  select*from openquery(mysql,'select id,cast(viewtype as char(30)) from       projects')

В данном запросе мы использовали функцию преобразования Mysql CAST().
Выше были простые запросы, а что делать если нам необходим запрос с условиями, в данном случае можно прибегнут ьк динамическим запросам.

К примеру так :
  Declare @sqlstr nvarchar(850)
  Set @sqlstr='insert into dbo.tasks_pr select id,[user],st,priority, from      openquery(sd,''SELECT id,user,cast(state as char(15)) as st,'

  set @sqlstr=@sqlstr+'cast(priority as char(15)) as priority FROM tasks t'

  set @sqlstr=@sqlstr+' where id>'+CAST(@idasnvarchar(10))+''')'
  --print @sqlstr
  execute sp_executesql @sqlstr

Кстати командой «print» легко проверять, что за команда получается в итоге.
Вот и все доступ к Mysql из MS SQL Server  получили.




2 комментария :

  1. Вот наоборот бы подключиться: из MySQL к MS SQL. Возможно ли такое и как.

    ОтветитьУдалить
    Ответы
    1. Скорее всего надо будет писать свое приложение для подключения к MS SQL Server и и перенос данных в Mysql.

      Удалить