"Невозможно создать экземпляр ошибки поставщика OLE DB" в качестве пользователя Windows Authentication

Я пытаюсь запустить openrowset из MS SQL Server на сервере Oracle.

Когда я выполняю следующую команду:

select * from
OPENROWSET('OraOLEDB.Oracle','srv';'user';'pass',
'select * from table')

происходит следующая ошибка

Msg 7302, Level 16, State 1, Line 1
Cannot create an instance of OLE DB provider "OraOLEDB.Oracle" for linked server "(null)".

Может ли кто-нибудь сказать мне, как я могу использовать openrowset с OraOLEDB.Oracle?

Я использую 64-разрядную версию MS SQL Server и Oracle OLEDB.

Изменить

Я пробовал это на двух машинах под управлением Windows 7 x64 и Windows Server 2008 x64 с MS SQL Server 2008 x64. Оба показали одинаковое сообщение об ошибке.

4 ответа

В SQL Server Enterprise Manager откройте \Server Objects\Linked Servers\Providers, щелкните правой кнопкой мыши поставщика OraOLEDB.Oracle, выберите свойства и установите флажок "Allow inprocess". Восстановите связанный сервер и снова проверьте.


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

  • Выполнить (CTRL + R) "dcomcnfg" . Перейдите в раздел "Службы компонентов → Компьютеры → Мой компьютер → Конфигурация DCOM".
  • Откройте страницу свойств "MSDAINITIALIZE".
  • Скопируйте "Идентификатор приложения" на странице свойств.
  • Закрыть "dcomcnfg" .
  • Запустите "regedit". Перейдите в "HKEY_CLASSES_ROOT\AppID {???}" с помощью??? представляющий идентификатор приложения, который вы скопировали на шаге № 3.
  • Щелкните правой кнопкой мыши папку "{???}" и выберите "Разрешения"
  • Добавить группу локальных администраторов в разрешения, предоставить им полный контроль.
  • Закрыть "regedit".
  • Перезагрузите сервер.
  • Запустите "dcomconfig". Перейдите в раздел "Службы компонентов → Компьютеры → Мой компьютер → Конфигурация DCOM".
  • Откройте страницу свойств "MSDAINITIALIZE".
  • На вкладке "Безопасность" выберите "Настроить" в разделе "Разрешения запуска и активации", затем нажмите кнопку "Изменить".
  • Добавьте "Аутентифицированные пользователи" и предоставите им все разрешения на запуск и активацию.
  • Закрыть "dcomcnfg" .
  • Найдите корневой каталог установки Oracle. "E:\Oracle" в моем случае.
  • Отредактируйте свойства безопасности корневого каталога Oracle. Добавьте "Аутентифицированные пользователи" и предоставите им "Чтение и выполнение", "Содержимое папки списка" и "Чтение". Примените новые разрешения.
  • Нажмите кнопку "Дополнительные разрешения", затем нажмите "Изменить разрешения". Выберите "Заменить все разрешения дочерних объектов с помощью наследуемых разрешений от этого объекта". Примените новые разрешения.
  • Найдите поставщика "OraOLEDB.Oracle" в SQL Server. Убедитесь, что установлен параметр "Разрешить обработку".
  • Перезагрузите сервер.


При подключении к SQL Server с проверкой подлинности Windows (в отличие от локальной учетной записи SQL Server) попытка использования связанного сервера может привести к появлению сообщения об ошибке:

Cannot create an instance of OLE DB provider "(OLEDB provider name)"...

Самый прямой ответ на эту проблему предоставляется Microsoft KB 2647989, так как "Параметры безопасности для класса MSDAINITIALIZE DCOM неверны".

Решение состоит в том, чтобы исправить параметры безопасности для MSDAINITIALIZE. В Windows Vista и более поздних версиях класс принадлежит TrustedInstaller, поэтому владение MSDAINITIALIZE должно быть изменено до того, как можно будет настроить защиту. В KB выше приведены подробные инструкции для этого.

Это сообщение в блоге MSDN описывает причину:

MSDAINITIALIZE - это класс COM, предоставляемый OLE DB. Этот класс может анализировать строки соединения OLE DB и загружать/инициализировать поставщика на основе значений свойств в строке соединения. MSDAINITILIAZE инициируется пользователями, подключенными к SQL Server. Если для подключения к SQL Server используется проверка подлинности Windows, поставщик инициализируется под учетной записью пользователя. Если зарегистрированный пользователь является логином SQL, поставщик инициализируется в учетной записи службы SQL Server. В зависимости от типа используемого входа необходимо предоставить разрешения на MSDAINITIALIZE.

Проблема восходит как минимум к SQL Server 2000; KB 280106 от Microsoft описывает ошибку (см. "Сообщение 3" ) и предлагает исправление установки флага In Process для поставщика OLEDB.

При настройке In Process можно решить ближайшую проблему, возможно, это не то, что вы хотите. Согласно Microsoft,

Активация провайдера вне процесса SQL Server защищает процесс SQL Server от ошибок в провайдере. Когда поставщик создается вне процесса SQL Server, обновления или вставки, ссылающиеся на длинные столбцы (текст, текст или изображение), не допускаются. - <a href="http://technet.microsoft.com/en-us/library/ms188095(v=sql.105).aspx" rel="nofollow noreferrer" target="_blank">Связанные свойства сервера doc для SQL Server 2008 R2</a>.

Лучшим ответом является руководство Microsoft и настройка безопасности MSDAINITIALIZE.


Для ошибки 7302, в частности, я обнаружил в своем реестре при поиске OraOLEDB.Oracle, что местоположение InprocServer32 было неправильным.

Если это событие или вы не можете найти эту строку в реестре, вам придется установить или перерегистрировать компонент.

Мне пришлось удалить ключ с уровня GUID, а затем найти ключ ProgID (OraOLEDB.Oracle) и удалить его тоже. (ProgID ссылается на CLSID как на пару).

Затем я перерегистрировал OraOLEDB.Oracle, вызвав regsvr32.exe на ORAOLEDB *.dll.

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

Теперь у меня есть ошибка 7308, о однопоточных квартирах; катясь!

licensed under cc by-sa 3.0 with attribution.