Configuración y solución de problemas de un servidor vinculado a una base de datos de Oracle en SQL Server

En este artículo se describe cómo configurar un servidor vinculado desde un equipo que ejecuta Microsoft SQL Server en una base de datos de Oracle y se proporcionan pasos básicos para solucionar errores comunes que puede experimentar al configurar un servidor vinculado en una base de datos de Oracle.

Versión original del producto: Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2005 Express Edition, Microsoft SQL Server 2005 Workgroup Edition
Número de KB original: 280106

Resumen

En este artículo se describe cómo configurar un servidor vinculado desde un equipo que ejecuta Microsoft SQL Server en una base de datos de Oracle y se proporcionan pasos básicos para solucionar errores comunes que puede experimentar al configurar un servidor vinculado en Oracle. La mayor parte de la información de este artículo es aplicable a entornos configurados para usar el proveedor OLEDB de Microsoft para Oracle (MSDAORA). Evite usar esta característica en el nuevo trabajo de desarrollo y planee modificar las aplicaciones que actualmente usan esta característica. En su lugar, use el proveedor OLE DB de Oracle.

Para obtener más información sobre cómo configurar un servidor vinculado mediante el proveedor OLEDB de Oracle, consulte Cómo ponerse en funcionamiento con Oracle y servidores vinculados.

Importante

La versión actual de Microsoft ODBC Driver for Oracle cumple con la especificación ODBC 2.5, mientras que el proveedor OLE DB para Oracle es un proveedor nativo de la API de OCI de Oracle 7. Tanto el controlador como el proveedor usan SQL*Net Client (o el cliente de Net8 para Oracle 8x) y la biblioteca de Oracle Call Interface (OCI) y otros componentes de cliente de Oracle, para conectarse a bases de datos de Oracle y recuperar datos. Los componentes de cliente de Oracle son importantes y deben configurarse correctamente para conectarse correctamente a bases de datos de Oracle mediante el controlador y el proveedor.

Desde Microsoft Data Access Components (MDAC) versión 2.5 y versiones posteriores, tanto microsoft ODBC Driver como el proveedor OLE DB admiten SOLO Oracle 7 y Oracle 8i con las siguientes limitaciones:

  • No se admiten tipos de datos específicos de Oracle 8.x, como CLOB, BLOB, BFILE, NCHAR, NCLOB y NVARCHAR2.

  • No se admite la característica Unicode en servidores Oracle 7.x y 8.x.

  • No se admiten varias instancias de cliente de Oracle, o varias casas de Oracle, porque se basan en la primera aparición del inicio de Oracle en la variable SYSTEM PATH.

  • No se admite la devolución de varios conjuntos de resultados de un procedimiento almacenado o una instrucción SQL por lotes mediante ADO o OLEDB.

  • No se admiten las combinaciones externas anidadas.

  • No se admite la persistencia XML.

  • No se admite la versión mayor que 8i mediante estos controladores.

Nota:

Los productos de otros fabricantes mencionados en este artículo son fabricados por compañías que no dependen de Microsoft. Microsoft no ofrece ninguna garantía, implícita o de otro tipo, respecto al rendimiento o la confiabilidad de estos productos.

Pasos para configurar un servidor vinculado en Oracle

  1. Debe instalar el software cliente de Oracle en el equipo que ejecuta SQL Server donde está configurado el servidor vinculado.

  2. Instale el controlador que desee en el equipo que ejecuta SQL Server. Microsoft solo admite Proveedor OLE DB de Microsoft para Oracle y Microsoft ODBC Driver for Oracle. Si usa un proveedor de terceros o un controlador de terceros para conectarse a Oracle, debe ponerse en contacto con el proveedor correspondiente para cualquier problema que pueda experimentar con su proveedor o controlador.

  3. Si usa Proveedor OLE DB de Microsoft para Oracle y Microsoft ODBC Driver for Oracle, tenga en cuenta lo siguiente:

    • Tanto el proveedor OLE DB como el controlador ODBC que se incluyen con Microsoft Data Access Components (MDAC) requieren SQL*Net 2.3.x o una versión posterior. Debe instalar el software cliente de Oracle 7.3.x, o una versión posterior, en el equipo cliente. El equipo cliente es el equipo que ejecuta SQL Server.

    • Asegúrese de que tiene MDAC 2.5, o una versión posterior, instalado en el equipo que ejecuta SQL Server. Con MDAC 2.1 o con una versión anterior, no puede conectarse a bases de datos que usen Oracle 8. x o una versión posterior.

    • Para habilitar MDAC 2.5, o versiones posteriores, para que funcione con software cliente de Oracle, el registro debe modificarse en el equipo cliente que ejecuta SQL Server como se indica en la tabla siguiente.

      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. Reinicie el equipo que ejecuta SQL Server después de instalar el software cliente de Oracle.

  5. En el equipo que ejecuta SQL Server, configure un servidor vinculado mediante el siguiente script.

    -- 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
    

    Nota:

    Si usa Microsoft ODBC Driver para Oracle, puede usar el @datasrc parámetro para especificar un nombre DSN. Para una conexión sin DSN, la cadena del proveedor se proporciona a través del parámetro @provstr . Con Proveedor OLE DB de Microsoft para Oracle, use el alias de servidor de Oracle configurado en el archivo TNSNames.Ora para el parámetro @datasrc. Para obtener más información, vea el tema "sp_addlinkedserver" en SQL Server Libros en pantalla.

Mensajes de error comunes y cómo solucionarlos

Importante

Esta sección, método o tarea contiene pasos que le indican cómo modificar el Registro. No obstante, pueden producirse problemas graves si modifica el registro de manera incorrecta. En consecuencia, asegúrese de seguir estos pasos cuidadosamente. Para mayor protección, cree una copia de seguridad del registro antes de modificarlo. Después, puede restaurar el registro si se produce un problema. Para obtener más información sobre cómo hacer una copia de seguridad y restaurar el Registro, haga clic en el número de artículo siguiente para verlo en Microsoft Knowledge Base: 322756 Cómo hacer una copia de seguridad y restaurar el Registro en Windows.

Puede usar cualquiera de los dos métodos siguientes para recuperar información extendida sobre cualquier error que experimente al ejecutar una consulta distribuida.

  • Método 1

    Conéctese a SQL Server mediante SQL Server Management Studio y ejecute el código siguiente para activar la marca de seguimiento 7300.

    DBCC Traceon(7300)
    
  • Método 2

    Capture el evento "Errores OLEDB" que se encuentra en la categoría de eventos "Errores y advertencias" en SQL Profiler. El formato del mensaje de error es el siguiente:

    Error de interfaz::Método con código hexadecimal de error.

    Puede buscar código hexadecimal de error en el archivo Oledberr.h que se incluye con el Kit de desarrollo de software (SDK) de MDAC.

A continuación se muestra una lista de mensajes de error comunes que pueden producirse, junto con información sobre cómo solucionar el mensaje de error.

Nota:

Si usa SQL Server 2005 o versiones posteriores, estos mensajes de error pueden ser ligeramente diferentes. Sin embargo, los identificadores de error de estos mensajes de error son los mismos que en versiones anteriores de SQL Server. Por lo tanto, puede identificarlos mediante los identificadores de error. Para problemas relacionados con el rendimiento, busque SQL Server Libros en pantalla para el tema Optimización de consultas distribuidas.

  • Mensaje 1

    Error 7399: El proveedor OLE DB "%ls" para el servidor vinculado "%ls" ha notificado un error. %ls

    Active la marca de seguimiento 7300 o use SQL Profiler para capturar el evento OLEDB Errors para recuperar información de error OLEDB extendida.

  • Mensaje 2a

    "ORA-12154: TNS:could not resolve service name"

  • Mensaje 2b

    "No se encontraron los componentes de red y cliente oracle(tm). Estos componentes son suministrados por Oracle Corporation y forman parte de la instalación de software cliente de Oracle Versión 7.3.3 (o posterior) "

    Estos errores se producen cuando hay un problema de conectividad con el servidor oracle. Revise la sección Técnicas para solucionar problemas de conectividad con el servidor de Oracle a continuación para obtener más solución de problemas.

  • Mensaje 3

    Error 7302: No se puede crear una instancia del proveedor OLE DB "MSDAORA" para el servidor vinculado "%ls".

    Asegúrese de que el archivo MSDAORA.dll está registrado correctamente. (El archivo MSDAORA.dll es el archivo del proveedor OLE DB de Microsoft para Oracle). Use RegSvr32.exe para registrar Proveedor OLE DB de Microsoft para Oracle.

    Nota:

    Si usa un proveedor de Oracle de terceros y su proveedor de Oracle no se puede ejecutar fuera de un proceso de SQL Server, puede habilitarlo para que se ejecute en proceso cambiando las opciones del proveedor. Para cambiar las opciones del proveedor, use uno de los métodos siguientes:

    • Método 1 Busque la siguiente clave del Registro. A continuación, cambie el valor de la entrada AllowInProcess (DWORD) a 1. Esta clave del Registro se encuentra en el nombre del proveedor correspondiente: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSSQLServer\Providers\ProviderName.

    • Método 2 Siga estos pasos para establecer la opción Permitir procesamiento para proveedores que usan SQL Server Management Studio (SSMS).

    1. Abra SSMS y conéctese a la instancia de SQL Server.
    2. En Explorador de objetos, vaya aProveedores deservidores> vinculados de objetos> de servidor.
    3. Haga clic con el botón derecho en el proveedor que desea configurar y seleccione Propiedades.
    4. En la ventana Opciones del proveedor , active la casilla Habilitar de la opción Permitir inprocesamiento .
  • Mensaje 4

    Error 7303: No se puede inicializar el objeto de origen de datos del proveedor OLE DB "MSDAORA" para el servidor vinculado "%ls". [Mensaje devuelto por el proveedor OLE/DB: ORA-01017: nombre de usuario/contraseña no válido; inicio de sesión denegado] Seguimiento de errores de OLE DB [El proveedor OLE/DB 'MSDAORA' IDBInitialize::Initialize devolvió 0x80040e4d].

    Este mensaje de error indica que el servidor vinculado no tiene la asignación de inicio de sesión correcta. Puede ejecutar el sp_helplinkedsrvlogin procedimiento almacenado para establecer la información de inicio de sesión correctamente. Además, compruebe que ha especificado los parámetros correctos para la configuración del servidor vinculado.

  • Mensaje 5

    Error 7306: No se puede abrir la tabla "%ls" del proveedor OLE DB "MSDAORA" para el servidor vinculado "%ls". La tabla especificada no existe. [Mensaje devuelto por el proveedor OLE/DB: La tabla no existe.] [Mensaje devuelto por el proveedor OLE/DB: ORA-00942: la tabla o vista no existe] Seguimiento de errores de OLE DB [Proveedor OLE/DB 'MSDAORA' IOpenRowset::OpenRowset devuelto 0x80040e37: La tabla especificada no existe.].

    Error 7312: Uso no válido del esquema o catálogo para el proveedor OLE DB "%ls" para el servidor vinculado "%ls". Se proporcionó un nombre de cuatro partes, pero el proveedor no expone las interfaces necesarias para usar un catálogo o esquema.

    Error 7313: Se especificó un esquema o catálogo no válido para el proveedor "%ls" para el servidor vinculado "%ls".

    Error 7314: El proveedor OLE DB "%ls" para el servidor vinculado "%ls" no contiene la tabla "%ls". La tabla no existe o el usuario actual no tiene permisos en esa tabla.

    Si recibe estos mensajes de error, es posible que falte una tabla en el esquema de Oracle o que no tenga permisos en esa tabla. Compruebe que el nombre del esquema se ha escrito con mayúsculas. El caso alfabético de la tabla y de las columnas debe ser el especificado en las tablas del sistema de Oracle.

    En el lado de Oracle, una tabla o una columna que se crea sin comillas dobles se almacena en mayúsculas. Si la tabla o la columna se incluyen entre comillas dobles, la tabla o la columna se almacenan tal y como están.

    En la llamada siguiente se muestra si la tabla existe en el esquema de Oracle. Esta llamada también muestra el nombre exacto de la tabla.

    sp_tables_ex @table_server=Ora817Link, @table_schema='your_schema_name'
    
  • Mensaje 6

    Error 7413: No se pudo conectar al servidor vinculado '%ls' (proveedor OLE DB '%ls'). Habilite la delegación o use un inicio de sesión de SQL Server remoto para el usuario actual. Mensaje 18456, nivel 14, estado 1, error de inicio de sesión de línea 1 para el usuario ''.

    Este mensaje de error indica que se intenta realizar una consulta distribuida para un inicio de sesión autenticado de Microsoft Windows sin una asignación de inicio de sesión explícita. En un entorno de sistema operativo en el que no se admite la delegación de seguridad, los inicios de sesión autenticados de Windows NT necesitan una asignación explícita a un inicio de sesión remoto y una contraseña creados mediante sp_addlinkedsrvlogin.

  • Mensaje 7

    Error 7391: No se pudo realizar la operación porque el proveedor OLE DB "MSDAORA" para el servidor vinculado "%ls" no pudo iniciar una transacción distribuida. Seguimiento de errores de OLE DB [Proveedor OLE/DB 'MSDAORA' ITransactionJoin::JoinTransaction devuelto 0x8004d01b]

    Compruebe que las versiones de OCI están registradas correctamente como se describió anteriormente en este artículo.

    Nota:

    Si las entradas del Registro son correctas, se carga el archivo MtxOCI.dll. Si no se carga el archivo MtxOCI.dll, no se pueden realizar transacciones distribuidas en Oracle mediante Proveedor OLE DB de Microsoft para Oracle o mediante Microsoft ODBC Driver for Oracle. Si usa un proveedor de terceros y recibe el error 7391, compruebe que el proveedor OLE DB que usa admite transacciones distribuidas. Si el proveedor OLE DB admite transacciones distribuidas, compruebe que el Coordinador de transacciones distribuidas de Microsoft (MSDTC) se está ejecutando y que tiene habilitado el acceso a la red.

  • Mensaje 8

    Error 7392: No se puede iniciar una transacción para el proveedor OLE DB "MSDAORA" para el servidor vinculado "%ls". Seguimiento de errores de OLE DB [Proveedor OLE/DB 'MSDAORA' ITransactionLocal::StartTransaction devolvió 0x8004d013: ISOLEVEL=4096].

    El proveedor OLE DB devolvió el error 7392 porque solo puede haber una transacción activa para esta sesión. Este error indica que se intenta realizar una instrucción de modificación de datos en un proveedor OLE DB cuando la conexión está en una transacción explícita o implícita, y el proveedor OLE DB no admite transacciones anidadas. SQL Server requiere esta compatibilidad para que, en determinadas condiciones de error, pueda finalizar los efectos de la instrucción de modificación de datos mientras continúa con la transacción.

    Si SET XACT_ABORT es ON, SQL Server no requiere compatibilidad con transacciones anidadas del proveedor OLE DB. Por lo tanto, ejecute SET XACT_ABORT ON antes de ejecutar instrucciones de modificación de datos en tablas remotas en una transacción implícita o explícita. Haga esto en caso de que el proveedor OLE DB que usa no admita transacciones anidadas.

Técnicas para solucionar problemas de conectividad con el servidor de Oracle

Para depurar los problemas de conectividad de Oracle con el controlador ODBC de Microsoft para Oracle o el Proveedor OLE DB de Microsoft para Oracle, siga estos pasos:

  1. Use la utilidad Oracle SQL Plus (una utilidad de consulta basada en línea de comandos) para comprobar que puede conectarse a Oracle y recuperar datos.

    Nota:

    Si no puede conectarse a Oracle y recuperar datos, tiene una instalación o configuración incorrectas de los componentes de cliente de Oracle o no ha creado correctamente un alias de servicio de Transparent Network Substrate (TNS) para el servidor de Oracle al usar la utilidad SQL*Net Easy Configuration o Oracle Net8 Easy Configuration. Póngase en contacto con el administrador de bases de datos de Oracle (DBA) para comprobar que los componentes de Oracle que debe tener están instalados y configurados correctamente.

  2. Compruebe la versión del cliente de Oracle (versión de SQL*Net) instalada en el equipo. Tanto el controlador ODBC de Microsoft para Oracle como el Proveedor OLE DB de Microsoft para Oracle requieren la instalación de SQL*Net versión 2.3 o posterior en el equipo cliente.

    La conectividad de SQL Plus (la herramienta de consulta de cliente de Oracle) puede parecer que funciona, pero debe reiniciar el equipo para que la conectividad ODBC/OLE DB funcione correctamente.

    Nota:

    Cuando se usa Oracle 8i, el archivo .rgs está vacío.

  3. Si el cliente de Oracle está instalado y recibe un error que indica que Oracle Client Components 7.3 o posterior debe estar instalado en el equipo, compruebe que la variable de entorno PATH en el equipo cliente contiene la carpeta en la que se instaló el cliente de Oracle, como , Oracle_Root\Bin. Si no encuentra esta carpeta, agregue la carpeta a la variable PATH para resolver el error.

  4. Compruebe que el archivo Ociw32.dll está en la carpeta Oracle_Root\bin . Este archivo .dll no puede existir en ninguna otra ubicación del equipo cliente. Asegúrese de que los archivos DLL del componente de cliente de Oracle (por ejemplo, el archivo Core40.dll y el archivo Ora*.dll) no existen fuera de la carpeta o subcarpetas de Oracle_Root .

  5. Compruebe que una sola versión de cliente de Oracle está instalada en el equipo. No pueden existir varias versiones de SQL*Net en el mismo equipo cliente con interferencias y con operaciones críticas (por ejemplo, búsquedas de TNS y alias).

  6. Microsoft recomienda tener una instalación local del cliente de Oracle y no hacerlo mediante la asignación de un cliente remoto de Oracle en el equipo y, a continuación, incluirlo en la ruta de acceso del sistema para conectarse a Oracle a través de ODBC/OLE DB. Pero el proveedor y el controlador se prueban con un cliente de Oracle instalado localmente y no en un recurso compartido de red.

Consulta también