Heterogeneous Services: Conexión desde Oracle a SQLServer - DBA Oracle

Este artículo para DBA's de Oracle explica como configurar los servicios de conexión heterogeneous de Oracle para poder visualizar bases de datos SQL Server desde un esquema Oracle, como si fueran objetos propios de Oracle.

En versiones antiguas de Oracle, esta conectividad se podía realizar a través de “Gateways” que se licenciaban de manera independiente del servidor Oracle, pero la posibilidad de realizar lo mismo en sentido contrario a través de SQL Server, posibilitó la aparición de los “Heterogeneous Services” de manera gratuita en Oracle.

Para poder realizar la configuración es necesario contar con los objetos necesarios del catálogo. Por defecto están instalados, pero en determinadas instalaciones puede ser necesario realizarlo manualmente. Para ello, ejecutar como SYS el fichero caths.sql del directorio %ORACLE_HOME%/rdbms/admin. Después, el DBA de Oracle sólo ha de seguir los siguientes pasos:

  • Crear un conector ODBC de SQL Server (System DSN) en el administrador de ODBC de Microsoft (por ejemplo, “sqlcon”)
     
  • Ajuste del fichero de inicialización de Heterogeneous Services
    Este fichero reside en ORACLE_HOME/HS/ADMIN, y su nombre depende del SID que se asigne al servicio. El nombre usado tipicamente es: hsodbc, de manera que el fichero se llamaría: inithsodbc.ora. Este fichero debe contener como mínimo los siguientes parámetros:

# Nombre de la conexión ODBC
HS_FDS_CONNECT_INFO = sqlmis
HS_FDS_TRACE_LEVEL = 0
HS_OPEN_CURSORS = 300

  • Configuración del fichero TNSNAMES.ORA
    Se debe añadir la siguiente entrada:

hsodbc =
    (DESCRIPTION =
       (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST = <IP_SERVIDOR> ) (PORT = 1521))
    )
    (CONNECT_DATA = (SID = hsodbc))
    (HS=OK)
    )

  • Configuración del fichero del Listener
    LISTENER.ORA: Se debe añadir a la SID_List el siguiente descriptor:

(SID_DESC =
    (SID_NAME = hsodbc)
    (ORACLE_HOME = C:\oracle\ora92)    # el ORACLE_HOME correspondiente
    (PROGRAM = hsodbc )
)

  • Reinicio del listener
    En los servicios del servidor reiniciar el servicio del listener.
     
  • Conectarse con un SQL*Plus a la instancia ORACLE, y crear un database link contra el SQL Server a través de HS:

SQL> create database link hsodbc connect to "usuario" identified by "password" using 'hsodbc'

El usuario y el password deben ser los usuarios de conexión a la BBDD de SQL Server. 
Por ejemplo, si el usuario es el “sa” los objetos a los que se llegará serán los objetos de la BBDD de sistema “master”.

 

Una vez configurado se puede acceder desde un esquema ORACLE a las tablas (objetos en general) de una BBDD SQL Server.
A modo de ejemplo, la sintaxis necesaria para realizar una simple join entre 2 tablas una Oracle y la otra SQL Server sería:

SELECT e.name, d.dept
FROM emp e, dept@hsodbc d
where e.id_dept=d.id_dept;

 

 

Oscar Paredes

IT Manager
Oracle DBA

oscar.paredes@dataprix.com

 

 

Attachment Size
XDAT012006.pdf 162 bytes

Este método sirve para cualquier base de datos? Se puede utilizar también con MySQL?

In reply to by Antonio (not verified)

Se puede conectar con el mismo sistema un Mysql a una base de datos Oracle.

Como ves el procedimiento sólo utiliza una conexión ODBC, que podría ser hacia SQL Server o hacia MySQL.

Un saludo,

In reply to by oscapt (not verified)

Realizando la conexión a MaxDB fu exitosa, se realizó siguiendo uno manuales publicados que encontre partiendo de este foro, lo que no he podido es conectarme a varias bases de datos, es decir, se configuran los archivos, pero como hace uno para habilitar un ODBC diferente. Me quiero conectar a una base de datos MaxDB y a otra SQLserver de manera simultánea. Gracias

Alguien sabe como enlazar una base de datos en SQL SERVER con una de ORACLE.

In reply to by ricardo (not verified)

Entiendo que quieres leer o escribir datos desde un SQL Server hacia un oracle.

En primer lugar debes tener el cliente de oracle en la maquina que va ha realizar el enlace. Puede que te sirva el conector OLEDB de SQL Server aunque no puedo asegurarlo puesto que en mi caso tengo las 2 bbdd en la misma máquina.

El nombre de servidor oracle debe ser: nombre_servidor_oracle/SID_oracle (no sirve nombre_servidor_oracle@sid)

usuario y password del schema a usar.

Con esto la conexión desde SQL Server a Oracle funciona perfectamente.

 

Saludos,

 

Sirve este sistema también para SQL Server 2005??

In reply to by Anonimo (not verified)

El hecho de utilizar un ODBC para el enlace con la base de datos destino hace que el sistema sirva para prácticamente cualquier base de datos.

Si en el servidor de la base de datos Oracle puedes configurar un ODBC que se conecte correctamente a otra base de datos, tienes que poder utilizar Heterogeneous Services para definir un enlace de Oracle a esta base de datos.

Con MySQL funciona, lo he podido comprobar personalmente, con SQLServer 2005 aún lo tendrás más fácil para definir el ODBC.

Carlos Fernández

Analista de sistemas

In reply to by Carlos

HOLA

 

sobre............"ejecutar como SYS el fichero caths.sql del directorio %ORACLE_HOME%/rdbms/admin." debo decir que uso el pl/sql ejecute el archivo como usuario sys y funciona mas o menos hasta la mitad del archivo y luego me sale error de sintaxis que no reconoce el comando SQL. como lo soluciono. SE QUE HA PASADO MUCHO TIEMPO DESDE QUE SALIO ESTE TUTORIAL PERO SI ALGUIEN VE ESTO POR FAVOR AYUDAAAAAA!!!!

In reply to by Percy (not verified)

PL/SQL? Lo haces desde una herramienta gráfica? Puede que ese sea el problema. Deberías ejecutarlo con SQLPlus, y dentro de una sesión del servidor donde está instalada la base de datos.

Si estás en linea de comandos con el usuario con el que se ha instalado la base de datos puedes hacer:

>sqlplus "/as sysdba"

Una vez dentro de SQLPLUS ejecutas el script con @ más el camino completo:

SQL>@oracle_home/rdbms/admin/caths

Si lo haces así no te debería fallar.

 Hola muy buena la respuesta de conexion conSqlServer... 

tengo un problema con la conexion Oracle_Access tengo mi base Oracle en Linux y una Base Acces en Windows con una aplicacion.... entonces quisiera saber como hacer la conxion de mi base oracle en Linux hacia la base Access en Windows

 

Gracias

Attm

Roger Reyes 

Buen post, aunque me llevó tiempo resolver un pequeño error.

se trata de la linea del TNSNAMES.ORA siguiente

(CONNECT_DATA = (SID = hsodbc))

que debería ser

(CONNECT_DATA = (SERVICE_NAME = hsodbc))

In reply to by luigi (not verified)

Creo que no es un error. El post se escribió hace tiempo, cuando se trabajaba normalmente con la versión 9i, y hasta esta versión todo funciona correctamente.

Si no me equivoco debes tener una 10g u 11g, y entonces la cadena sí que ha de ser la que indicas.
Resumiendo:

Para versiones <= 9i:
(CONNECT_DATA = (SID = hsodbc))

Para versiones posteriores a 9i:
(CONNECT_DATA = (SERVICE_NAME = hsodbc))

Gracias por la observación, luigi

Saludos

queria preguntar por un problema que me surge, se trata que ya me conecto a MySQL 4.1,
pero el problema es que no me despliega las columnas varchar de MySQL y solo me muestra el primer registro y las dos primeras columnas que son numéricas, la tabla tiene 4 columnas
Id tipo int
sucursal tipo double
nombre tipo text
cedula tipo text
, hago select * from facturas@mysql pero solo muestra Id y sucursal del primer registro,
incluso si hago select "nombre" from facturas@mysql me dice que no se conoce la columna
esta con minusculas igual que el MySQL, talvez saben que me falta configurar?

he hecho agregando la clausula WHERE funciona pero siempre me muestra un registro y no reconoce las columnas text, si por ahi tienen alguna pista les agradezco mucho de antemano

In reply to by Anonim. (not verified)

Me imagino que esto ya se resolvio esto hace mucho tiempo, pero para los que lleguen a leer, a mi me paso lo mismo y era la version del Odbc, utilice el 3.51.27 y listo.

In reply to by Siyulena (not verified)

El problema era de hace tiempo, pero seguro aún sigue pasando, así que gracias por compartir tu solución, seguro que va a ser de ayuda :)

 

Hola. En mi caso, requiero pasar los datos desde una base de datos MySQL ubicados en un servidor a una base de datos Oracle ubicados en otro servidor diferente o que por el contrario la base de datos Oracle vaya y consulte los datos de MySQL y los inserte en oracle. Qué necesitaría en este caso? es posible? Gracias de antemano.

In reply to by Anonimo (not verified)

Con MySQL también debería funcionarte. La única diferencia es que tendrás que definir el conector ODBC en el servidor de Oracle apuntando hacia MySQL en lugar de hacia SQL Server.

Saludos,
Estoy realizando una consulta desde oracle a una tabla que esta en sql server, pero mi problema es que me dice en oracle que el tamaño de logitud del nombre de la tabla es muy largo, hay manera de solucionar este problema sin que tenga que tener que cambiar el nombre de la tabla que se encuentra en sql server?

Ejemplo:

SELECT e.name, d.dept
FROM emp e, a1235456789012345678901234567899@hsodbc d
where e.id_dept=d.id_dept;

ORA-00972: identifier is too long

In reply to by Anonimo (not verified)

Has probado a crear una vista en SQL Server con el nombre de tabla 'corto' y llamarla desde HS?

create view v_a12354567890 as select * from a1235456789012345678901234567899

Puede que también te dé el error, pero la prueba es muy rápida.

Si esto no te sirve, una opción desde Oracle es utilizar el package de PL/SQL DBMS_HS_PASSTHROUGH, que te permite ejecutar sentencias en otras bases de datos y recibir los resultados sin que Oracle interprete nada.

No me preguntes cómo funciona porque no lo he utilizado aún, pero te enlazo la documentación del paquete por si te sirve de ayuda.

Quisiera saber si con solo poner el ORACLE_HOME funciona o si debo tener alguna libreria en especial. mi BD es ORACLE 11g y la necesito establecer la conexion con un windows server 2008 R2...

gracias

In reply to by Inquietud (not verified)

En principio no hace falta ninguna librería especial para utilizar Oracle heterogeneous services, sólo que existan los objetos del catálogo que dice el post, y seguir todos los pasos de configuración para que puedas utilizar un ODBC para conectar con SQL Server.

Buenas Tardes hay alguna forma de realizar una conexión desde Oracle a sqlserver sin licenciamiento de Oracle Gateway, o los diferentes driver ODBC licenciados que existen? mi caso es entre una bd Oracle 11.2.0.4 en AIX y una bd sqlserver 2008 r2, los 2 sistemas a 64bits

Hola Buenas Tardes Tengo una conexión de oracle a firebird ,pero al realizar un select * from all_tables@DBLINK, no reconoce algunas tablas de firebird ,las cuales las necesito para hacer algunos cruces. Estoy utilizando oracle 10,centos 6. Utilizando oracle 11 en windows funciona correctamente. Gracias