sql server - linked - Error "No se puede crear una instancia del proveedor OLE DB" como usuario de autenticación de Windows
sql server linked server oracle (6)
Al conectarse a SQL Server con la autenticación de Windows (a diferencia de una cuenta local de SQL Server), intentar usar un servidor vinculado puede generar el mensaje de error:
Cannot create an instance of OLE DB provider "(OLEDB provider name)"...
Microsoft KB 2647989 proporciona la respuesta más directa a este problema porque "la configuración de seguridad para la clase DCOM MSDAINITIALIZE es incorrecta".
La solución es arreglar la configuración de seguridad de MSDAINITIALIZE. En Windows Vista y versiones posteriores, la clase es propiedad de TrustedInstaller, por lo que la propiedad de MSDAINITIALIZE debe cambiarse antes de que se pueda ajustar la seguridad. La KB de arriba tiene instrucciones detalladas para hacerlo.
Esta publicación del blog de MSDN describe la razón :
MSDAINITIALIZE es una clase COM que proporciona OLE DB. Esta clase puede analizar cadenas de conexión OLE DB y cargar / inicializar el proveedor en función de los valores de propiedad en la cadena de conexión. MSDAINITILIAZE es iniciado por usuarios conectados a SQL Server. Si se usa la autenticación de Windows para conectarse a SQL Server, el proveedor se inicializa bajo la cuenta de usuario que inició sesión. Si el usuario que inició sesión es un inicio de sesión de SQL, el proveedor se inicializa bajo la cuenta de servicio de SQL Server. Según el tipo de inicio de sesión utilizado, los permisos en MSDAINITIALIZE deben proporcionarse en consecuencia.
El problema se remonta al menos a SQL Server 2000; El KB 280106 de Microsoft describe el error (consulte el "Mensaje 3") y tiene la solución sugerida para configurar el indicador En proceso para el proveedor OLEDB.
Si bien la configuración In Process puede resolver el problema inmediato, puede que no sea lo que desea. Según Microsoft,
La creación de una instancia del proveedor fuera del proceso de SQL Server protege el proceso de SQL Server de errores en el proveedor. Cuando se crea una instancia del proveedor fuera del proceso de SQL Server, no se permiten actualizaciones o inserciones que hagan referencia a columnas largas (texto, texto o imagen). - Doc. De propiedades del servidor vinculado para SQL Server 2008 R2 .
La mejor respuesta es ir con la guía de Microsoft y ajustar la seguridad de MSDAINITIALIZE.
Estoy intentando ejecutar openrowset desde MS SQL Server en un servidor Oracle.
Cuando ejecuto el siguiente comando:
select * from
OPENROWSET(''OraOLEDB.Oracle'',''srv'';''user'';''pass'',
''select * from table'')
se produce el siguiente error
Msg 7302, Level 16, State 1, Line 1
Cannot create an instance of OLE DB provider "OraOLEDB.Oracle" for linked server "(null)".
¿Puede alguien decirme cómo puedo usar openrowset con OraOLEDB.Oracle
?
Estoy utilizando la versión de 64 bits de MS SQL Server y el controlador Oracle OLEDB.
Editar
He intentado esto en dos máquinas que ejecutan Windows 7 x64 y Windows Server 2008 x64 con MS SQL Server 2008 x64 . Ambos mostraban el mismo mensaje de error.
Aparte de otras excelentes respuestas, solo tuve que dar permisos NTFS a la carpeta de instalación de Oracle. (Le di acceso de lectura)
En el Administrador OraOLEDB.Oracle
SQL Server, abra /Server Objects/Linked Servers/Providers
, haga clic con el botón derecho en el proveedor de OraOLEDB.Oracle
, seleccione propiedades y marque la opción "Allow inprocess"
. Vuelva a crear su servidor vinculado y pruebe de nuevo.
También puede ejecutar la siguiente consulta si no tiene acceso a SQL Server Management Studio:
EXEC master.dbo.sp_MSset_oledb_prop N''OraOLEDB.Oracle'', N''AllowInProcess'', 1
En particular, para el error 7302, descubrí, en mi registro, al buscar OraOLEDB.Oracle que la ubicación de InprocServer32 era incorrecta.
Si ese es el caso, o no puede encontrar esa cadena en el registro, entonces deberá instalar o volver a registrar el componente.
Tuve que eliminar la clave del nivel GUID, y luego encontrar la clave ProgID (OraOLEDB.Oracle), y eliminarla también. (El ProgID se enlaza al CLSID como un par).
Luego volví a registrarme en OraOLEDB.Oracle llamando a regsvr32.exe en ORAOLEDB * .dll.
El solo hecho de volver a registrarme no solucionó el problema, tuve que eliminar las claves de registro para que apunte a la ubicación correcta. Alternativamente, hackear la ubicación InprocServer32.
Ahora tengo el error 7308, sobre apartamentos de un solo hilo; ¡Rodando!
Se encontró con este problema en el que el servidor vinculado funcionaría para usuarios que eran administradores locales en el servidor, pero no para nadie más. Después de muchas horas de perder el tiempo, logré solucionar el problema usando los siguientes pasos:
- Ejecute (CTRL + R) "dcomcnfg". Vaya a "Servicios de componentes -> Computadoras -> Mi computadora -> Configuración DCOM".
- Abra la página de propiedades de "MSDAINITIALIZE".
- Copie el "ID de aplicación" en la página de propiedades.
- Cierre de "dcomcnfg".
- Ejecutar "regedit". Navegue hasta "HKEY_CLASSES_ROOT / AppID {???}" con el ??? representando el ID de la aplicación que copió en el paso # 3.
- Haga clic derecho en la carpeta "{???}" y seleccione "Permisos"
- Agregue el grupo de administradores locales a los permisos, concédales el control total.
- Cierre de “regedit”.
- Reinicie el servidor.
- Ejecutar "dcomconfig". Vaya a "Servicios de componentes -> Computadoras -> Mi computadora -> Configuración DCOM".
- Abra la página de propiedades de "MSDAINITIALIZE".
- En la pestaña "Seguridad", seleccione "Personalizar" en "Permisos de inicio y activación", luego haga clic en el botón "Editar".
- Agregue "Usuarios autenticados" y concédales los 4 permisos de inicio y activación.
- Cierre de "dcomcnfg".
- Encuentra el directorio raíz de instalación de Oracle. "E: / Oracle" en mi caso.
- Edite las propiedades de seguridad del directorio raíz de Oracle. Agregue "Usuarios autenticados" y concédales permisos de "Lectura y ejecución", "Lista de contenidos de carpeta" y "Lectura". Aplicar los nuevos permisos.
- Haga clic en el botón "Permisos avanzados", luego haga clic en "Cambiar permisos". Seleccione "Reemplazar todos los permisos de objetos secundarios con permisos heredables de este objeto". Aplicar los nuevos permisos.
- Encuentre el proveedor "OraOLEDB.Oracle" en SQL Server. Asegúrese de que el parámetro "Permitir proceso" está marcado.
- Reinicie el servidor.
Situación similar para la siguiente configuración:
- Windows Server 2012 R2 Standard
- MS SQL Server 2008 (probado también SQL 2012)
- Cliente Oracle 10g (OracleDB v8.1.7)
- Proveedor de MSDAORA
- ID de error: 7302
Mi solución:
- Instale 32bit MS SQL Server (64bit MSDAORA no existe)
- Instale el parche 32bit Oracle 10g 10.2.0.5 (configure la compatibilidad con W7 en setup.exe)
- Reiniciar servicios SQL
- Verificar Permitir en proceso en el proveedor de MSDAORA
- Probar la conexión del servidor oracle vinculado