.¿Alguna vez han necesitado pasar información entre dos DBMS?
En mi trabajo tengo una base de datos SQL Server 2005 y otra Oracle 8i (ambas en versión Estándar). Para pasar información de una a otra usamos archivos como intermediarios. No es divertido ni fácil programar para eso, las validaciones son ridículamente complicadas en Oracle Developer, aunque el PL/SQL deja escribir código bellamente estructurado y con buen manejo de excepciones, es largo validarlas todas…
Entonces se me ocurrió probar los vínculos de base de datos del SQL Server, que supuestamente son sencillos. Como en realidad no lo conozco más que lo suficiente de este, seguí alegremente los pasos del asistente (e instale las herramientas de cliente del Oracle 9i, ese es mi dominio). Muy simple, se configura la distribución de datos, luego se crea el vínculo. ¿Qué? Es directo contra mi base Oracle. Fantástico.
Luego al hacer clic en “Finalizar”, acabo mi alegría. Después de hacer todo, después de haber configurado todo, me advirtió que solo la versión Empresarial del SQL Server permite acceder a bases de Datos Oracle. Un fiasco total. (Ver acá la solución)
Con esa decepción decidí buscar una solución del lado de mi base Oracle, quizás debí hacerlo desde el inicio pero caí en la tentación de los asistentes de Siguiente-Siguiente-Finalizar de Microsoft.
En Oracle la solución más barata se llama Fuentes Heterogéneas. Esta no solo permite acceder datos de SQL Server sino de cualquier base de datos que tenga ODBC (muchas, desde Access). Pero en Oracle NADA INTERESANTE es Siguiente-Siguiente-Finalizar (Salvo la instalación y la creación de una instancia). No hay mucha documentación en línea y no sabía dónde quedaron los libros (además eran de la versión 7 en UNIX). Así que usando la instancia de pruebas me lance al ruedo.
Me tomo algunas horas, sobre todo porque mi estado anímico no es del todo adecuado para algo así. Aquí les detallo los pasos, para hacer lo que yo hice, para que se ayuden si necesitan hacerlo.
Nota:
Luego de más pruebas y practicas he refinado este tutorial, ahora es algo mas simple.
Que necesitas
- Una Maquina Windows (se puede usar otro SO, mientras tenga los controladores ODBC, que es complicado)
- El Disco Instalador de la base por si las dudas.
- Los Controladores ODBC se la base que quieres acceder.
- Una instancia de Oracle Funcionando.
- Golosinas.
- Vida social, si estás leyendo esto o peor escribiéndolo, ese un mal síntoma.
Servidor 1, de la Fuente Heterogénea (Windows + Oracle + ODBC)
Configurar el DSN
En el Panel de Control, Herramientas Administrativas, Orígenes de Datos ODBC, configuramos un DSN de sistema. No importa el sabor, solo importa configurarlo bien y probarlo. También he notado que es mejor seleccionar una Base de Datos predeterminada, para este ejemplo le puse el nombre DSN_LINK.
Además para SQL Server lo mejor es crear o usar autenticación del servidor y no la de Windows (A menos que tu servidor Oracle este bien configurado para esto y tu dominio Windows NT también lo esté)
En esta máquina debe estar instalada una instancia de la base de datos, no basta con las herramientas de cliente. Si no conocen como esta su licenciamiento es mejor que sea la misma máquina del servidor principal (Que para poder usar ODBC mejor si es tiene que ser Windows MUAHAHAHAHAHAHA)
Preparar la Instancia
Como primer paso recomiendo desactivar los nombres globales para hacer la vida más placentera:
alter system set global_names=false;
Y se deben crear los objetos para el vínculo heterogéneo, afortunadamente podemos ejecutar este archivo (debe hacerse como el usuario “internal”):
ORACLE_HOME\rdbms\admin\caths.sql
ORACLE_HOME se refiere al directorio en donde está instalada la base, ¿obvio no?
Preparar el nuevo Listener
Ahora se sebe preparar el nuevo servicio de escucha para la funciona de fuente heterogénea, editando el archivo ORACLE_HOME\network\ADMIN\LISTENER.ORA se le añade algo así:
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = [Nombre o IP del SERVIDOR])(PORT = [Puerto]))
)
)
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC=
(SID_NAME=FHLISTENER)
(ORACLE_HOME = [SU DIRECTORIO DE ORACLE_HOME AQUI, TIPO C:\ORACLE])
(PROGRAM=hsodbc)
)
)
Deben notar algunas cosas, primero el puesto, la base Oracle normalmente usa el 1521, además si hacemos esto en el mismo servidor de nuestra base solo hay que añadir el servicio, así en SID_LIST:
(SID_DESC=
(SID_NAME=FHLISTENER)
(ORACLE_HOME = [SU DIRECTORIO DE ORACLE_HOME AQUI, TIPO C:\ORACLE])
(PROGRAM=hsodbc)
)
También debe notarse que es importante configurar el ORACLE_HOME.
Guardamos los cambios.
Configurar la fuente Heterogénea
El servicio se configura creando el archivo initFHLISTENER.ora (init + el nombre del listener) en el directorio ORACLE_HOME\hs\admin. HS_FDS_CONNECT_INFO guarda el nombre del DSN, HS_DB_NAME guarda el nombre de la base de datos predeterminada, general un archivo básico solo tendría estas líneas:
HS_FDS_CONNECT_INFO = DSN_LINK
HS_FDS_TRACE_LEVEL = off
HS_DB_NAME= [BASE DE DATOS PREDETERMINADA]
Me dio mejores resultados al poner un nombre para la base de datos predeterminada. Con esto listo reiniciamos el servicio de escucha…
Servidor 2, de la Base de Datos Oracle (Cualquier SO + Oracle)
Configurar el TNS en el servidor Oracle
Antes a que no sabías que TNS es acrónimo de Transparent Network Substrate, y uno configurando algo con un nombre tan geek interesante. El archivo de configuración de los TNS lo encuentras en: ORACLE_HOME\network\ADMIN\ TNSNAMES.ORA
NOMBREDELTNS =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=[Nombre o IP del servidor DSN])(PORT=[EL puerto del servicio, eg. 1521]))
(CONNECT_DATA=(SID=FHLISTENER))
(HS=OK)
)
Unas aclaraciones. Nótese el HS=OK para este TSN en particular, adicionalmente este servidor no necesariamente tienen que estar una maquina Windows, ya que usa el TSN nativo de Oracle para conectarse.
Crear el Vínculo
En el servidor Oracle todo es tan simple como usar esta instrucción para conectar todo:
CREATE DATABASE LINK sql_link CONNECT TO "USUARIO SQL SERVER" IDENTIFIED BY "CONTASEÑA" USING ' NOMBREDELTNS';
Es importante notar el nombre de usuario y la contraseña. Esto suponiendo que uso la autenticación de SQL Server. Además NO RECOMIENDO USAR EL USUARIO SA, aunque este viene desactivado en SQL Server 2005. Es mejor crear un usuario para esto.
Si quieren librarse del vínculo pueden usar:
DROP DATABASE LINK sql_link
Un ejemplo de consulta sencilla:
SELECT * FROM tabla@sql_link
Hay que recordar que los nombres de las tablas no existen en nuestra base Oracle, si queremos seleccionar ciertas columnas, o usar una clausula Where se deben poner los nombres entre comillas:
SELECT "columna1", "columna2" FROM tabla@sql_link where "columna1" = condición
Incluso la vida puede ser mucho mas simple usando CREATE SYNONYM.
Notas para usar con Oracle Developer 6i
Oracle Developer está diseñado para acceder a los datos de una base Oracle, no de un vinculo de fuentes heterogéneas, no a menos que se lo engañe
Primero se crea una vista, esto hace que el Bloque de Datos en Developer sea de solo lectura, pero lo demás se puede compensar en Triggers, además mi objetivo inicial era este.
Probado en Oracle 8i
CREATE OR REPLACE VIEW vista
("ROWID", columna1, columna2)
AS
SELECT ROWNUM, "columna1", "columna2" FROM tabla@sql_link;
Probado en Oracle 10g
CREATE OR REPLACE VIEW vista
AS
SELECT ROWNUM as "ROWID", "columna1" columna1, "columna2" columna2 FROM tabla@sql_link;
No olvidar los permisos (en modo absoluto y no recomendable para todos):
GRANT ALL ON vista TO PUBLIC;
Esto es porque Developer necesita la columna ROWID, pero la fuente heterogénea no la proporciona. En ese momento se me ocurrió crear una vista de la fuente. Funciona porque tomo la columna ROWNUM y la renombro como ROWID en la vista, el truco es poner ROWID entre comillas en Oracle 8i y usar los alias en el select en Oracle 10g.
Con eso puedo ver los datos de SQL Server directamente en Oracle Forms, procesarlos, realizar importaciones y incluso usar el Reports contra SQL Server.
Nota de Descarga
Como todo, este post se proporciona como referencia, tal cual como es. No me culpen si rompen algún servidor, aunque si lo hacen quizás pueda ayudar.
Me pareció muy interesante tu artículo El caso de las Fuentes Heterogéneas, pero me quedan dudas cuando te tienes que conectar a un DSN que apunta a una BD access o un archivo DBF de DBASE, en tales casos como no son servidores de BD propiamente dichos es imposible asignarles un puerto y un Host, por lo menos eso es lo que creo. Si me puedes ayudar con esa cuestión te lo agradecería.
Saludos
Eduardo
Asi es, el puerto y el host son los del servicio de escucha de las fuentes heterogéneas de Oracle. Este servicio accede a los datos por medio de ODBC. Afortunadamente la existen drivers ODBC para la gran mayoría de bases de datos.