Настройка и устранение неполадок связанного сервера с базой данных Oracle в SQL Server

В этой статье описывается настройка связанного сервера с компьютера под управлением Microsoft SQL Server в базу данных Oracle, а также приводятся основные действия по устранению распространенных ошибок, которые могут возникнуть при настройке связанного сервера для базы данных Oracle.

Исходная версия продукта: Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 выпуск Enterprise, Microsoft SQL Server 2005, экспресс-выпуск, Microsoft SQL Server 2005 Workgroup Edition
Исходный номер базы знаний: 280106

Сводка

В этой статье описывается настройка связанного сервера с компьютера под управлением Microsoft SQL Server в базу данных Oracle, а также приводятся основные действия по устранению распространенных ошибок, которые могут возникнуть при настройке связанного сервера в Oracle. Большая часть сведений, приведенных в этой статье, относится к средам, настроенным для использования поставщика Microsoft OLEDB для Oracle (MSDAORA). Избегайте использования этой функции в новых работах по разработке и планируйте изменение приложений, которые в настоящее время используют эту функцию. Вместо этого используйте поставщик OLE DB oracle.

Дополнительные сведения о настройке связанного сервера с помощью поставщика OLEDB oracle см. в статье Как приступить к работе с Oracle и связанными серверами.

Важно!

Текущая версия Microsoft ODBC Driver for Oracle соответствует спецификации ODBC 2.5, а поставщик OLE DB для Oracle — это собственный поставщик API OCI Oracle 7. Драйвер и поставщик используют клиент SQL*Net (или клиент Net8 для Oracle 8x), библиотеку Интерфейса вызовов Oracle (OCI) и другие клиентские компоненты Oracle для подключения к базам данных Oracle и получения данных. Клиентские компоненты Oracle важны и должны быть правильно настроены для успешного подключения к базам данных Oracle с помощью драйвера и поставщика.

В компонентах доступа к данным Майкрософт (MDAC) версии 2.5 и более поздних версиях драйвер Microsoft ODBC и поставщик OLE DB поддерживают только Oracle 7 и Oracle 8i со следующими ограничениями:

  • Типы данных Oracle 8.x, такие как CLOB, BLOB, BFILE, NCHAR, NCLOB и NVARCHAR2, не поддерживаются.

  • Функция Юникода для серверов Oracle 7.x и 8.x не поддерживается.

  • Несколько клиентских экземпляров Oracle или несколько домов Oracle не поддерживаются, так как они полагаются на первое вхождение дома Oracle в переменной SYSTEM PATH.

  • Возврат нескольких наборов результатов из хранимой процедуры или пакетной инструкции SQL не поддерживается с помощью ADO или OLEDB.

  • Вложенные внешние соединения не поддерживаются.

  • Сохраняемость XML не поддерживается.

  • Версии больше 8i не поддерживаются с помощью этих драйверов.

Примечание.

Сторонние продукты, которые обсуждаются в этой статье, производятся компаниями, независимыми от Microsoft. Корпорация Майкрософт не дает никаких явных, подразумеваемых и прочих гарантий относительно производительности или надежности этих продуктов.

Действия по настройке связанного сервера для Oracle

  1. Необходимо установить клиентское программное обеспечение Oracle на компьютере, работающем SQL Server, где настроен связанный сервер.

  2. Установите необходимый драйвер на компьютере под управлением SQL Server. Корпорация Майкрософт поддерживает только поставщик OLE DB для Oracle (Майкрософт) и Microsoft ODBC Driver for Oracle. Если вы используете стороннего поставщика или стороннего драйвера для подключения к Oracle, необходимо обратиться к соответствующему поставщику за любыми проблемами, которые могут возникнуть при использовании его поставщика или драйвера.

  3. Если вы используете поставщик OLE DB для Oracle (Майкрософт) и Microsoft ODBC Driver for Oracle, учитывайте следующее:

    • Поставщику OLE DB и драйверу ODBC, который входит в состав компонентов доступа к данным Майкрософт (MDAC), требуется SQL*Net 2.3.x или более поздняя версия. На клиентском компьютере необходимо установить клиентское программное обеспечение Oracle 7.3.x или более позднюю версию. Клиентский компьютер — это компьютер, на котором выполняется SQL Server.

    • Убедитесь, что на компьютере под управлением SQL Server установлена mdac 2.5 или более поздняя версия. В MDAC 2.1 или более ранней версии невозможно подключиться к базам данных, используюющим Oracle 8. x или более поздняя версия.

    • Чтобы включить MDAC 2.5 или более поздних версий для работы с клиентским программным обеспечением Oracle, необходимо изменить реестр на клиентском компьютере, на котором выполняется SQL Server, как показано в следующей таблице.

      Oracle
      Client               Microsoft Windows 2000 and later versions
      --------------------------------------------------------------------------
      
      7.x                  [HKEY_LOCAL_MACHINE\SOFTWARE
                           Microsoft\MSDTC\MTxOCI]
                           "OracleXaLib"="xa73.dll"
                           "OracleSqlLib"="SQLLib18.dll"
                           "OracleOciLib"="ociw32.dll"
      
      8.0                  [HKEY_LOCAL_MACHINE\SOFTWARE
                           \Microsoft\MSDTC\MTxOCI]
                           "OracleXaLib"="xa80.dll"
                           "OracleSqlLib"="sqllib80.dll"
                           "OracleOciLib"="oci.dll"
      
      8.1                  [HKEY_LOCAL_MACHINE\SOFTWARE
                           \Microsoft\MSDTC\MTxOCI]
                           "OracleXaLib"="oraclient8.dll"
                           "OracleSqlLib"="orasql8.dll"
                           "OracleOciLib"="oci.dll"
      
  4. Перезагрузите компьютер под управлением SQL Server после установки клиентского программного обеспечения Oracle.

  5. На компьютере под управлением SQL Server настройте связанный сервер с помощью следующего скрипта.

    -- Adding linked server (from SQL Server Books Online):
    /* sp_addlinkedserver [@server =] 'server'[, [@srvproduct =] 'product_name']
     [, [@provider =] 'provider_name']
     [, [@datasrc =] 'data_source']
     [, [@location =] 'location'] [, [@provstr =] 'provider_string'] 
     [, [@catalog =] 'catalog']
    */
    
    EXEC sp_addlinkedserver 'Ora817Link', 'Oracle', 'MSDAORA', 'oracle817'
    
    -- Adding linked server login:
    /* sp_addlinkedsrvlogin [@rmtsrvname =] 'rmtsrvname'[,[@useself =] 'useself']
     [,[@locallogin =] 'locallogin']
     [,[@rmtuser =] 'rmtuser']
     [,[@rmtpassword =] 'rmtpassword']
    */
    
    EXEC sp_addlinkedsrvlogin 'Ora817Link', 'FALSE',NULL, 'scott', 'tiger'
    
    -- Help on the linked server:
    EXEC sp_linkedservers
    EXEC sp_helpserver
    select * from sysservers
    

    Примечание.

    Если вы используете @datasrc Microsoft ODBC Driver for Oracle, можно использовать параметр, чтобы указать имя DSN. Для подключения без DSN строка поставщика предоставляется через параметр @provstr . В поставщик OLE DB для Oracle (Майкрософт) используйте псевдоним сервера Oracle, настроенный в файле TNSNames.Ora для параметра @datasrc. Дополнительные сведения см. в разделе "sp_addlinkedserver" SQL Server электронной документации.

Распространенные сообщения об ошибках и способы их устранения

Важно!

В этот раздел, описание метода или задачи включены действия, содержащие указания по изменению параметров реестра. Однако неправильное изменение параметров реестра может привести к возникновению серьезных проблем. Поэтому следует в точности выполнять приведенные инструкции. Для дополнительной защиты создайте резервную копию реестра, прежде чем редактировать его. Так вы сможете восстановить реестр, если возникнет проблема. Дополнительные сведения о резервном копировании и восстановлении реестра см. в следующем номере статьи базы знаний Майкрософт: 322756 Резервное копирование и восстановление реестра в Windows

Вы можете использовать один из следующих двух методов для получения расширенных сведений о любой ошибке, возникающей при выполнении распределенного запроса.

  • Способ 1

    Подключитесь к SQL Server с помощью SQL Server Management Studio и выполните следующий код, чтобы включить флаг трассировки 7300.

    DBCC Traceon(7300)
    
  • Способ 2

    Запишите событие "Ошибки OLEDB", которое находится в категории событий "Ошибки и предупреждения" в SQL Profiler. Формат сообщения об ошибке следующий:

    Сбой метода Interface:::с кодом шестнадцатеричной ошибки.

    Вы можете найти код шестнадцатеричной ошибки в файле Oledberr.h, который входит в состав пакета SDK MDAC.

Ниже приведен список распространенных сообщений об ошибках, которые могут возникать, а также сведения об устранении неполадок с сообщением об ошибке.

Примечание.

Если вы используете SQL Server 2005 или более поздних версий, эти сообщения об ошибках могут немного отличаться. Однако идентификаторы ошибок этих сообщений об ошибках такие же, как и в более ранних версиях SQL Server. Поэтому их можно определить по идентификаторам ошибок. Для проблем, связанных с производительностью, выполните поиск SQL Server электронной документации по оптимизации распределенных запросов.

  • Сообщение 1

    Ошибка 7399: поставщик OLE DB "%ls" для связанного сервера "%ls" сообщил об ошибке. %ls

    Включите флаг трассировки 7300 или используйте SQL Profiler для записи события ошибок OLEDB для получения расширенных сведений об ошибках OLEDB.

  • Сообщение 2a

    "ORA-12154: TNS:не удалось разрешить имя службы"

  • Сообщение 2b

    "Клиентские и сетевые компоненты Oracle(tm) не найдены. Эти компоненты поставляются корпорацией Oracle и являются частью установки клиентского программного обеспечения Oracle версии 7.3.3 (или более поздней)

    Эти ошибки возникают при проблеме с подключением к серверу Oracle. Дополнительные сведения об устранении неполадок см. в разделе Способы устранения проблем с подключением к серверу Oracle ниже.

  • Сообщение 3

    Ошибка 7302: не удается создать экземпляр поставщика OLE DB "MSDAORA" для связанного сервера "%ls".

    Убедитесь, что файл MSDAORA.dll зарегистрирован правильно. (Файл MSDAORA.dll является поставщиком Microsoft OLE DB для файла Oracle.) Используйте RegSvr32.exe для регистрации поставщик OLE DB для Oracle (Майкрософт).

    Примечание.

    Если вы используете стороннего поставщика Oracle и ваш поставщик Oracle не может выполняться вне процесса SQL Server, включите его для выполнения внутри процесса, изменив параметры поставщика. Чтобы изменить параметры поставщика, используйте один из следующих методов:

    • Способ 1. Найдите следующий раздел реестра. Затем измените значение записи AllowInProcess (DWORD) на 1. Этот раздел реестра находится под соответствующим именем поставщика: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Providers\ProviderName.

    • Способ 2. Выполните следующие действия, чтобы задать параметр Разрешить inprocess для поставщиков, использующих SQL Server Management Studio (SSMS).

    1. Откройте SSMS и подключитесь к экземпляру SQL Server.
    2. В обозреватель объектов перейдите к разделуПоставщикисвязанных серверов>объектов> сервера.
    3. Щелкните правой кнопкой мыши поставщика, который требуется настроить, и выберите Пункт Свойства.
    4. В окне Параметры поставщика проверка поле Включить для параметра Разрешить inprocess.
  • Сообщение 4

    Ошибка 7303: не удается инициализировать объект источника данных поставщика OLE DB "MSDAORA" для связанного сервера "%ls". [Возвращено сообщение поставщика OLE/DB: ORA-01017: недопустимое имя пользователя или пароль; вход запрещен] Трассировка ошибок OLE DB [ПОСТАВЩИК OLE/DB "MSDAORA" IDBInitialize::Initialize вернулся 0x80040e4d].

    Это сообщение об ошибке указывает, что связанный сервер не имеет правильного сопоставления входа. Вы можете выполнить хранимую sp_helplinkedsrvlogin процедуру, чтобы правильно задать сведения для входа. Кроме того, убедитесь, что заданы правильные параметры для конфигурации связанного сервера.

  • Сообщение 5

    Ошибка 7306: не удается открыть таблицу "%ls" из поставщика OLE DB "MSDAORA" для связанного сервера "%ls". Указанная таблица не существует. [Возвращенное сообщение поставщика OLE/DB: таблица не существует.] [Возвращено сообщение поставщика OLE/DB: ORA-00942: таблица или представление не существует] Трассировка ошибок OLE DB [поставщик OLE/DB 'MSDAORA' IOpenRowset::OpenRowset вернул 0x80040e37: указанная таблица не существует.].

    Ошибка 7312: недопустимое использование схемы и (или) каталога для поставщика OLE DB "%ls" для связанного сервера "%ls". Было указано четырехкомпонентное имя, но поставщик не предоставляет необходимые интерфейсы для использования каталога и (или) схемы.

    Ошибка 7313: указана недопустимая схема или каталог для поставщика "%ls" для связанного сервера "%ls".

    Ошибка 7314: поставщик OLE DB "%ls" для связанного сервера "%ls" не содержит таблицу "%ls". Таблица либо не существует, либо у текущего пользователя нет разрешений на нее.

    Если вы получаете эти сообщения об ошибках, таблица может отсутствовать в схеме Oracle или у вас могут отсутствовать разрешения на эту таблицу. Убедитесь, что имя схемы введено в верхнем регистре. Алфавитный регистр таблицы и столбцов должен быть указан в системных таблицах Oracle.

    На стороне Oracle таблица или столбец, созданные без двойных кавычек, хранятся в верхнем регистре. Если таблица или столбец заключены в двойные кавычки, таблица или столбец сохраняются как есть.

    Следующий вызов показывает, существует ли таблица в схеме Oracle. Этот вызов также показывает точное имя таблицы.

    sp_tables_ex @table_server=Ora817Link, @table_schema='your_schema_name'
    
  • Сообщение 6

    Ошибка 7413: не удалось подключиться к связанному серверу "%ls" (поставщик OLE DB "%ls"). Включите делегирование или используйте удаленный SQL Server имя входа для текущего пользователя. Msg 18456, Level 14, State 1, Line 1 Login failed for user ''.

    Это сообщение об ошибке указывает, что выполняется попытка выполнить распределенный запрос для входа с проверкой подлинности Microsoft Windows без явного сопоставления входа. В среде операционной системы, в которой делегирование безопасности не поддерживается, Windows NT имена входа, прошедшие проверку подлинности, должны явно сопоставляться с удаленным именем входа и паролем, созданными с помощью sp_addlinkedsrvlogin.

  • Сообщение 7

    Ошибка 7391: не удалось выполнить операцию, так как поставщик OLE DB MSDAORA для связанного сервера "%ls" не смог начать распределенную транзакцию. Трассировка ошибок OLE DB [поставщик OLE/DB "MSDAORA" ITransactionJoin::JoinTransaction вернул 0x8004d01b]

    Убедитесь, что версии OCI зарегистрированы правильно, как описано выше в этой статье.

    Примечание.

    Если все записи реестра верны, загружается файл MtxOCI.dll. Если файл MtxOCI.dll не загружен, вы не сможете выполнять распределенные транзакции для Oracle с помощью поставщик OLE DB для Oracle (Майкрософт) или Microsoft ODBC Driver for Oracle. Если вы используете стороннего поставщика и получаете сообщение об ошибке 7391, убедитесь, что поставщик OLE DB, который вы используете, поддерживает распределенные транзакции. Если поставщик OLE DB поддерживает распределенные транзакции, убедитесь, что координатор распределенных транзакций Майкрософт (MSDTC) работает и имеет ли сетевой доступ.

  • Сообщение 8

    Ошибка 7392: не удается запустить транзакцию для поставщика OLE DB MSDAORA для связанного сервера "%ls". Трассировка ошибок OLE DB [поставщик OLE/DB 'MSDAORA' ITransactionLocal::StartTransaction вернул 0x8004d013: ISOLEVEL=4096].

    Поставщик OLE DB вернул ошибку 7392, так как для этого сеанса может быть активна только одна транзакция. Эта ошибка указывает на то, что инструкция изменения данных предпринимается с поставщиком OLE DB, когда соединение находится в явной или неявной транзакции, а поставщик OLE DB не поддерживает вложенные транзакции. SQL Server требуется эта поддержка, чтобы при определенных ошибках можно было завершить действие инструкции изменения данных при продолжении транзакции.

    Если SET XACT_ABORT имеет значение ON, SQL Server не требует поддержки вложенных транзакций от поставщика OLE DB. Поэтому выполните команду SET XACT_ABORT ON перед выполнением инструкций изменения данных для удаленных таблиц в неявной или явной транзакции. Это происходит в том случае, если поставщик OLE DB, который вы используете, не поддерживает вложенные транзакции.

Методы устранения проблем с подключением к серверу Oracle

Чтобы отладить проблемы с подключением Oracle с помощью драйвера Microsoft ODBC для Oracle или поставщик OLE DB для Oracle (Майкрософт), выполните следующие действия.

  1. Используйте служебную программу Oracle SQL Plus (служебную программу запросов на основе командной строки), чтобы убедиться, что вы можете подключиться к Oracle и получить данные.

    Примечание.

    Если не удается подключиться к Oracle и получить данные, у вас есть неправильная установка или конфигурация клиентских компонентов Oracle или неправильное создание псевдонима службы прозрачной подложки сети (TNS) для сервера Oracle при использовании простой конфигурации SQL*Net или простой конфигурации Oracle Net8. Обратитесь к администратору базы данных Oracle (DBA), чтобы убедиться, что необходимые компоненты Oracle установлены и настроены правильно.

  2. Проверьте версию клиента Oracle (версия SQL*Net), установленную на компьютере. Как драйвер Microsoft ODBC для Oracle, так и поставщик OLE DB для Oracle (Майкрософт) требует установки SQL*Net версии 2.3 или более поздней на клиентском компьютере.

    Может показаться, что подключение из SQL Plus (средство запросов клиента Oracle) работает, но для правильной работы подключения ODBC/OLE DB необходимо перезагрузить компьютер.

    Примечание.

    При использовании Oracle 8i RGS-файл пуст.

  3. Если установлен клиент Oracle и появляется сообщение об ошибке, указывающее, что на компьютере должны быть установлены клиентские компоненты Oracle версии 7.3 или более поздней версии, убедитесь, что переменная среды PATH на клиентском компьютере содержит папку, в которой был установлен клиент Oracle, например Oracle_Root\Bin. Если вы не можете найти эту папку, добавьте ее в переменную PATH, чтобы устранить ошибку.

  4. Убедитесь, что файл Ociw32.dll находится в папке Oracle_Root\bin . Этот .dll файл не может существовать в любом другом расположении на клиентском компьютере. Убедитесь, что библиотеки DLL компонента клиента Oracle (например, файл Core40.dll и файл Ora*.dll) не существуют за пределами папки или вложенных папок Oracle_Root.

  5. Убедитесь, что на компьютере установлена одна версия клиента Oracle. Несколько версий SQL*Net не могут существовать на одном клиентском компьютере с помехами и критическими операциями (например, TNS и подстановкой псевдонимов).

  6. Корпорация Майкрософт рекомендует использовать локальную установку клиента Oracle и не делать это путем сопоставления удаленного клиента Oracle на компьютере, а затем включить его в путь системы для подключения к Oracle через ODBC/OLE DB. Но поставщик и драйвер тестируются с помощью локально установленного клиента Oracle, а не в общей сетевой папке.

См. также