Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 не могу достучаться до базы под Oracle  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
Добрый день, помогите, пожалуйста! Имею MS SQL 2005 (ну, или он меня... это как посмотреть:)), пытаюсь прочитать данные из базы данных под управлением Oracle. И не могу:

1. Провайдер есть: процедура
exec master..xp_enum_oledb_providers
выдает
...
OraOLEDB.Oracle {3F63C36E-51A3-11D2-BB7D-00C04FA30080} Oracle Provider for OLE DB
...

2. Юзер под Oracle есть:
SQL> connect TEST_2011_0428/TEST_2011_0428@XE
Connected.
SQL> select 1 a from dual;
         1
SQL>

3. Пытаюсь сделать
select * from openrowset (
  'OraOLEDB.Oracle',
  'TEST_2011_0428/TEST_2011_0428@XE',
  'select 1 from dual' 
) 
- и получаю ошибку:
OLE DB provider "OraOLEDB.Oracle" for linked server "(null)" returned message "ORA-01017: invalid username/password; logon denied".
Msg 7303, Level 16, State 1, Line 1
Cannot initialize the data source object of OLE DB provider "OraOLEDB.Oracle" for linked server "(null)".


Как вы понимаете, дело не в том, что пароль не подходит к логину. А в чем?
28 апр 11, 20:36    [10583317]     Ответить | Цитировать Сообщить модератору
 Re: не могу достучаться до базы под Oracle  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
Как вы понимаете, дело не в том, что пароль не подходит к логину.


Гм... Сообщение

автор
ORA-01017: invalid username/password; logon denied


как бы говорит, что именно в том.

Вы уверены, что правильно указываете значения параметров для OPENROWSET?

OPENROWSET 
( { 'provider_name' , { 'datasource' ; 'user_id' ; 'password'
| 'provider_string' }
, { [ catalog. ] [ schema. ] object
| 'query'
}
28 апр 11, 20:42    [10583328]     Ответить | Цитировать Сообщить модератору
 Re: не могу достучаться до базы под Oracle  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
pkarklin
автор
Как вы понимаете, дело не в том, что пароль не подходит к логину.


Гм... Сообщение

автор
ORA-01017: invalid username/password; logon denied


как бы говорит, что именно в том.

Вы уверены, что правильно указываете значения параметров для OPENROWSET?

OPENROWSET 
( { 'provider_name' , { 'datasource' ; 'user_id' ; 'password'
| 'provider_string' }
, { [ catalog. ] [ schema. ] object
| 'query'
}


Ну конечно же, нет :). Не уверен. Но вот так:

select * from openrowset (
  'OraOLEDB.Oracle',
  'XE';'TEST_2011_0428';'TEST_2011_0428',
  'select 1 a from dual' 
) 

Не работает тоже. Но спасибо за здравую мысль: сообщение пишет другое.
Msg 7320, Level 16, State 2, Line 1
Cannot execute the query "select 1 a from dual" against OLE DB provider "OraOLEDB.Oracle" for linked server "(null)".
28 апр 11, 21:01    [10583392]     Ответить | Цитировать Сообщить модератору
 Re: не могу достучаться до базы под Oracle  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
А если такой:

select 1 from dual 
28 апр 11, 21:15    [10583444]     Ответить | Цитировать Сообщить модератору
 Re: не могу достучаться до базы под Oracle  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
pkarklin
А если такой:
select 1 from dual 

Результат тот же самый. С любым запросом. В том числе и к другой базе данных. К реальной таблице. И к представлению tab.
28 апр 11, 21:25    [10583481]     Ответить | Цитировать Сообщить модератору
 Re: не могу достучаться до базы под Oracle  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Если попробовать указать провайдера как OraOLEDB.Oracle.1
28 апр 11, 21:40    [10583537]     Ответить | Цитировать Сообщить модератору
 Re: не могу достучаться до базы под Oracle  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
pkarklin
Если попробовать указать провайдера как OraOLEDB.Oracle.1



А что такое OraOLEDB.Oracle.1 ? Что означает единица?

(результат тот же самый)
28 апр 11, 21:45    [10583550]     Ответить | Цитировать Сообщить модератору
 Re: не могу достучаться до базы под Oracle  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Shlippenbaranus,

Это версия провайдера. Если настроить linked server результат будет тот же?
28 апр 11, 21:50    [10583561]     Ответить | Цитировать Сообщить модератору
 Re: не могу достучаться до базы под Oracle  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
pkarklin
Если настроить linked server результат будет тот же?


Я не уверен, что я правильно его настраиваю. Я пишу так:
exec sp_addlinkedserver
  @server='OraTest', 
  @srvproduct='Oracle',
  @provider='OraOLEDB.Oracle', 
  @datasrc='TESTDBLINK'

exec sp_addlinkedsrvlogin
  @rmtsrvname = 'OraTest', 
  @useself = 'false', 
  @locallogin = 'sa', 
  @rmtuser = 'TEST_2011_0428', 
  @rmtpassword = 'TEST_2011_0428'

select * from openquery(
  OraTest, 'select 1 a from dual'
)
, и получаю
OLE DB provider "OraOLEDB.Oracle" for linked server "OraTest" returned message "ORA-12154: TNS:could not resolve the connect identifier specified".
Msg 7303, Level 16, State 1, Line 1
Cannot initialize the data source object of OLE DB provider "OraOLEDB.Oracle" for linked server "OraTest".

Хотя на стороне Oracle имеем:
SQL> select * from all_db_links;

PUBLIC
TESTDBLINK
TEST_2011_0428
XE
28.04.11

PUBLIC
DBMS_CLRDBLINK
ORACLR_CONNECTION_DATA
28.04.11

SQL> select 1 from dual@TESTDBLINK;
         1
SQL>

В MS SQL авторизация Windows
28 апр 11, 22:12    [10583648]     Ответить | Цитировать Сообщить модератору
 Re: не могу достучаться до базы под Oracle  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Подождите... Причем тут db_link?! TESTDBLINK это имя инстанса Oracle, который прописан в локальном для SQL Server tnsnames.ora?
28 апр 11, 22:16    [10583665]     Ответить | Цитировать Сообщить модератору
 Re: не могу достучаться до базы под Oracle  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
pkarklin
Подождите... Причем тут db_link?! TESTDBLINK это имя инстанса Oracle, который прописан в локальном для SQL Server tnsnames.ora?


TESTDBLINK - это именно линк к базе данных (это НЕ имя инстанса из tnsnames.ora), зачем он здесь - х. его з. Сделал по писанному. Тыкался, было написано - сделайте линк к базе данных, я сделал. Лично мне этот линк тоже кажется лишним, но, к сожалению, с именем инстанса, т.е. вот так:
exec sp_addlinkedserver
  @server='Xe', 
  @srvproduct='Oracle',
  @provider='OraOLEDB.Oracle', 
  @datasrc='Xe'
- тоже не пашет. Ошибку только я сейчас не приведу.
28 апр 11, 23:48    [10583968]     Ответить | Цитировать Сообщить модератору
 Re: не могу достучаться до базы под Oracle  [new]
invm
Member

Откуда: Москва
Сообщений: 9825
Может все-таки покажете содержимое tnsnames.ora с машины, где установлен SQL Server?
Часом не instant client используется? Помнится, были у меня подобные бесплодные пляски с бубном, пока не установил полноценного клиента. Правда давно это было, сейчас может все и поменялось.
29 апр 11, 00:02    [10584000]     Ответить | Цитировать Сообщить модератору
 Re: не могу достучаться до базы под Oracle  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
Тыкался, было написано - сделайте линк к базе данных, я сделал


Куда Вы тыкались?! Где в документации по MS SQL сказано, что надо создавать ораклячий db_link?! Вопрос про tnsnames.ora остается открытым.
29 апр 11, 08:19    [10584316]     Ответить | Цитировать Сообщить модератору
 Re: не могу достучаться до базы под Oracle  [new]
Shlippenbaranus
Member

Откуда:
Сообщений: 241
pkarklin, invm - спасибо за ваши вопросы. С db_link-ком я тогда стормозил, действительно, какой там может быть db_link. Это я уже тыкался от безнадеги, и, в результате, неправильно с аглицкого перевел :).

В настоящее время проблема решилась, дело было в не установленном флаге Allow inprocess в свойствах провайдера.

Для новичков вроде меня опишу основные этапы решения данной задачи, "Как достучаться до Oracle":

1. Устанавливаем клиента Oracle. Instant client и вправду плох, хотя одному человеку его удалось побороть: Oracle Instant Client 10.2 + MS SQL 2000. Я свой 11.2.0.2.0 тем же способом не поборол, поставил Oracle10g Provider for OLE DB Version 10.1.0.4.0, взятый отсюда. Доступ к Oracle Database 11g Enterprise Edition Release 11.2.0.1.0, в результате, нормальный.

2. Устанавливаем флаг Allow inprocess в свойствах провайдера OraOLEDB.Oracle. Проще всего это сделать с помощью менеджера объектов Microsoft SQL Server Management Studio, список провайдеров находится в подразделе Linked Servers раздела Server Objects.

3. Создаем linked server:
exec sp_addlinkedserver
  @server = 'чтоб_тебя_гада_подбросило',
  @srvproduct = 'Oracle',
  @provider = 'OraOLEDB.Oracle',
  @datasrc = 'имя инстанса из tnsnames.ora'

sp_addlinkedsrvlogin
  @rmtsrvname = 'чтоб_тебя_гада_подбросило', 
  @useself = 'false', 
  @locallogin = null, 
  @rmtuser = 'юзер', 
  @rmtpassword = 'пароль'
, тестируем соединение:
exec sp_testlinkedserver
  @servername = чтоб_тебя_гада_подбросило
При успешном создании сервера, процедура отрабатывает без ошибок ("Command(s) completed successfully.")

4. Выполняем тестовый запрос:
select * from openquery(
  чтоб_тебя_гада_подбросило, 'select 1 a from dual'
)
- у меня получилось. Точно так же при установленном флаге Allow inprocess благополучно выполняется запрос
select * from openrowset (
  'OraOLEDB.Oracle',
  'имя инстанса из tnsnames.ora';'юзер';'пароль',
  'select 1 a from dual' 
) 
, не требующий создания связанного сервера.

(Для тех, кто будет пробовать, напомню, что такие запросы считаются небезопасными - пароль передается по сети в открытом виде - и поэтому их выполнение нужно отдельно разрешить при помощи утилиты SQL Server Surface Area Configuration из комплекта поставки Microsoft SQL Server-а.)

Если же флаг Allow inprocess в свойствах провайдера не установлен, тестирование связанного сервера при помощи sp_testlinkedserver завершается благополучно, но даже простейший select 1 a from dual обваливается: возникает уже упоминавшаяся в моем втором посте ошибка
Cannot execute the query "select 1 a from dual" against OLE DB provider "OraOLEDB.Oracle" for linked server "..."
, с той только разницей, что на месте троеточия не null, а имя связанного сервера.

Альтернативный способ "достучаться до Oracle" - обратиться, в кач-ве провайдера, к MSDAORA. Как это сделать - по русски написано здесь. В этом случае, чтобы провайдер "завелся", нужно поправить руками реестр, и лично у меня есть наблюдение: параметры OracleSqlLib и OracleXaLib в разделах [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Transaction Server\Local Computer\My Computer] и [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\MTxOCI] действительно должны существовать, но их конкретные значения заметной роли не играют. У меня, например, все благополучно работало и с 10-тым клиентом, и когда на машине был установлен OracleXE 11g R2, а значения OracleXaLib и OracleSqlLib при этом были от "восьмерки": xa80.dll" и "sqllib80.dll" соответственно.
26 май 11, 12:54    [10712390]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить