Metrika

16 декабря 2010 г.

Как я линковал Oracle 11g к SQL Server 2008

Исходные данные такие: SQL Server Standard Edition 2008 R2(64-bit) стоит на Microsoft Server 2008 R2 Standard. К нему линкую Orcale 11g R2. Сразу скажу, получилось не с первого раза, было 4 попытки.Тому, кто работал 8 лет на SQL Server, а с Ораклом имел дело пару раз (это я про себя), разобраться было очень не просто. Вообще с моей точки зрания Оракл очень своеобразная СУБД, ну это дело привычки.

1. Необходимо скачать с сайта Оракла клиентское ПО: http://www.oracle.com/technetwork/database/enterprise-edition/downloads/112010-win64soft-094461.html. Я качал вот это: Oracle Database 11g Release 2 Client (11.2.0.1.0) for Microsoft Windows (x64)

2. Установить на винду, в установке выбрать второй пункт Administrative Tools (может как то по другому называется). Я переустанавливал 4 раза. В третий раз выбрал не второй пункт, а первый (Client), а потом поставил второй пункт, потом все снес и поставил 4-й раз второй пункт, это может быть существенно, т.к. заработало только после четвертой переустановки.

3. В папке D:\app\sergey.antonov\product\11.2.0\client_4\network\admin\sample взять файл tnsnames.ora, скопировать его в папку на уровень выше: D:\app\sergey.antonov\product\11.2.0\client_4\network\admin и прописать там TNS-алиас:
 ORA_SERVER =
   (DESCRIPTION =
      (ADDRESS_LIST =
          (ADDRESS = (PROTOCOL = TCP)(HOST =  192.168.0.1)(PORT = 1521))
       )
    (CONNECT_DATA =
          (SID = SOME_SID)
     )
   )

3.1. Можно сделать проверку соединения:
All Programs -> Oracle - OraClient11g_home4 -> Configuration and Migration Tools -> Net Manager
Там в дереве открываем:
Oracle Net Configuration -> Local -> Service Naming -> ORA_SERVER

Далее тыкаем в панели слева третью кнопку сверху. Это тест. Он отправляет запрос от пользователя scott с паролем tiger. Если он залочен, выведется соответсвующая инфа об ошибке. Но в окошке будет кнопка Change Login, тыкаем ее и меняем логин и пароль и снова проводим тест

3.2. Тест через SQL Plus (можно поселектить данные, что б понять, что есть доступ к таблицам). Start -> Run -> cmd
В консоли пишем: sqlplus <oracle_user>/<oracle_password>@ORA_SERVER
последний параметр - имя TNS
Далее можно выполнить запрос: select * from scheme.table;

4. Прилинковать сервер в SQL Server:
EXEC sp_addlinkedserver 'ORA_SERVER', 'Oracle', 'OraOLEDB.Oracle', 'ORA_SERVER'
EXEC sp_addlinkedsrvlogin 'ORA_SERVER', 'FALSE', NULL, '<oracle_user>', '<oracle_password>'

 В обоих процедурах первый параметр - это имя создаваемого линкованного сервера

В SQL Server Server Objects -> Linked Servers -> Providers -> ORaOLEDB.Oracle, правой кнопкой и в окне свойств должны быть чек-боксы в полях Dynamic parameter и Allow inprocess

Сначала при установке Allow inprocess при запросе к данным выдавал ошибку, что то типа какой то мегафаулт, крэш и все такое у провайдера ORaOLEDB.Oracle, а если галку снять, то выдавало Acces Denied (но акцес был не динаед, т.к. я проверял через SQL Plus и все работало).

4.1. Т.к. после первых трех переустановок клиентской части Оракла линкованный сервер не работал (причем если на нем нажать правой кнопкой и сделать Test Connection, то тест проходил успешно), я решил еще раз переустановить клиентскую часть, т.е. повторить все пункты с 2-3 и создать ODBC соединение.

All Programs -> Oracle - OraClient11g_home4 -> Configuration and Migration Tools -> Microsoft ODBC Administrator
(его можно и по другому вызвать, просто тут мне было удобнее)

В вкладке System DSN создаем запись:
В окне "Select driver ..." выбираем Oracle in OraClient11g_home4
Заполняем поля:
Data Source Name: ORA_SERVER
TNS Service Name: ORA_SERVER (выбираем из списка)
На вкладке Application я еще установил чек бокс Read-Only Connection (т.к. мне нужно было только читать)

Далее линкуем сервер:
EXEC sp_addlinkedserver @server = 'ORA_SERVER_ODBC', @srvproduct = '', @provider = 'MSDASQL', @datasrc = 'ORA_SERVER'
EXEC sp_addlinkedsrvlogin 'ORA_SERVER_ODBC', 'false', NULL, '<oracle_user>', '<oracle_password>'

 И после этого запросы стали выполняться, но выдавалась только одна строка, хотя точно известно, что их там больше. В чем проблема - не понятно. Мне говорили, что такая проблема была у людей даже при линковке в SQL Server другого SQL Server'а через ODBC, но как пофиксили не помнят.

Потом я решил прилинковать сервер, как в пункте 4, установить галки Dynamic parameter и Allow inprocess, и, о чудо, все заработало.

5. Выборка данных:
так не работает: select * from ORA_SERVER..scheme.table

Делал так:
1) EXEC('select * from scheme.table') AT ORA_SERVER
  для того, что б работало, надо на линкованом сервере кликнуть правой кнопкой и на вкладке Server Options установить в True поля RPC и RPC Out (может быть одно лишнее, но я не разбирался)
2) SELECT * FROM OPENQUERY(ORA_SERVER, 'select * from scheme.table')
3) SELECT * FROM OPENROWSET('OraOLEDB.Oracle', 'ORA_SERVER'; '<oracle_user>' ; '<oracle_password>', 'select * from scheme.table') AS a
что б работало так надо выполнить команды:
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;

ИТОГО:
Все вроде просто, но заработало далеко не сразу. Мое мнение, что проблема была в галке провайдера Allow inprocess (т.к. очень много постов на форумах с обсуждением данной проблемы указывали именно на нее), но по какой то причине (возможно из-за 64 битной винды) ораклячий провайдер не корректно работал при ее установке.
Возможно повилияло то, что в третий раз я сначала установил клиента оракла (первый пункт в инсталяшке), а потом админские проги (второй пунк в инсталяшке), когда я все опять удалил, он много оставил в папке D:\app\sergey.antonov\product\11.2.0\client_3\, больше чем в D:\app\sergey.antonov\product\11.2.0\client_2.
Был вариант настроть через провайдера MSDAORA (это майкрософтовский провайдер для Oracle), но у меня ни как не работала, на форумах писали, что надо скачать для 64 битной системы, но я не нашел где, а где то на майкрософтовском форуме увидел инфу, что он только для Oracle 8 и что надо использовать другой провайдер, хотя в других ветках на вопрос по поводу OraOLEDB.Oracle писали, что это не их продукт, используйте MSDAORA.

ССЫЛКИ ПО ТЕМЕ:
http://snippets.dzone.com/posts/show/3731 - про настройку линкованного сервера через ODBC, правда к DB2, но суть ясна
http://www.sql.ru/Forum/actualthread.aspx?bid=3&tid=6303&hl= - про аналог команды LIMIT, TOP в Оракле

1 комментарий :