Creación y Uso de DBLinks en Oracle

Juan Mellado, 29 Marzo, 2007 - 20:26

OracleUn Database Link (DBLink) en Oracle es un tipo de objeto que permite realizar una conexión desde una base de datos a otra. Su principal objetivo es ocultar el detalle de los parámetros de conexión necesarios, facilitándonos un sencillo acceso a los recursos disponibles en otras bases de datos, independientemente de que estas se encuentren instaladas en el mismo servidor o no.

Aunque es un concepto sencillo de entender, suele generar bastante confusión cuando uno se tropieza con él por primera vez, sobre todo porque hay varios elementos involucrados en su creación y suelen plantearse dudas acerca de en qué base de datos concreta, de entre las dos que se quieren conectar, tienen que crearse dichos elementos.

Supongamos que tenemos dos bases de datos: productos y usuarios. La base de datos de productos almacena el inventario de una empresa, con los detalles de los artículos que oferta y entre los que se incluye el tipo de público al que se dirige cada artículo en particular. Por su parte la base de datos de usuarios contiene un ficha detallada de cada uno de los usuarios registrados en una web en la que se incluye la edad, sexo y lugar de residencia. En un determinado momento, la web decide realizar un estudio para comprobar que producto dentro de los ofertados por la empresa serían del agrado de sus usuarios en función de sus datos personales. Para realizar tal estudio decide contrastar la información de las dos bases de datos, y para ello deciden utilizar un DBLink que permita consultar datos de los productos desde la base de datos de usuarios. ¿Cuales serían los pasos a seguir?

En primer lugar, en la base de datos de productos, debería crearse un usuario nuevo, que será el que se utilice para acceder a los datos de productos. Dicho usuario será un usuario normal de Oracle, y debería tener como mínimo permiso para conectar e iniciar sesión en la base de datos de productos, y por supuesto para acceder a los objetos (tablas, vistas, ...) que contengan los datos que se quieren poder consultar desde la base de datos de usuarios. En un caso bastante típico de este tipo de accesos lo que se hará será crear un role para aglutinar en él los permisos, en vez de asignárselos directamente al usuario, y crear vistas específicas para los datos que deben poder consultarse, en vez de permitir que pueda accederse directamente a toda la base de datos.

CREATE ROLE rol;
GRANT CONNECT TO rol;
GRANT SELECT ON vista1 TO rol;
GRANT SELECT ON vista2 TO rol;
CREATE USER usuario IDENTIFIED BY clave;
GRANT rol TO usuario;

Y en segundo lugar, en la base de datos de usuarios, deberá crearse el database link para acceder a la base de datos de productos utilizando el usuario y clave recién creados en la otra base de datos.

CREATE PUBLIC DATABASE LINK db_productos
CONNECT TO usuario
IDENTIFIED BY clave
USING 'connect_string_productos';

Una vez creado el DBLink puede empezar a usarse sin más en la base de datos de usuarios con la siguiente sintaxis:

SELECT * FROM vista1@db_productos;

Aunque para simplificar las sentencias se puede crear un sinónimo en la base de datos de usuarios:

CREATE PUBLIC SYNONYM vista1_productos FOR vista1@db_productos;

De forma que pueda escribirse:

SELECT * FROM vista1_productos;

¿No encontró lo que buscaba?

Utilice el buscador para encontrar más páginas en esta web o en toda Internet.
 
Web www.inmensia.com
Ramon (no verificado), 19 Enero, 2011 - 20:23

Excelente, sos un genio, mejor explicado imposible.

LDB (no verificado), 24 Enero, 2011 - 15:40

Hola, una explicación muy buena, sencilla, simple, con ejemplos concretos y un texto explicativo completamente comprensible. Realmente no sé si el texto es un copy-paste, pero me re sirvió!!

Muchas gracias.

Marcelo (no verificado), 28 Enero, 2011 - 19:32

que seria : USING 'connect_string_productos'???

Juan Mellado, 30 Enero, 2011 - 10:20

El "connect string" es el nombre de la base de datos.

Al establecer una conexión con una base de datos normalmente se especifican tres parámetros: usuario, clave del usuario y nombre de la base de datos. "Connect string" (cadena de conexión) es el nombre de la base de datos.

En el ejemplo, "connect_string_productos" es el nombre de la base de datos de productos.

Anónimo (no verificado), 10 Marzo, 2011 - 21:46

hola estoy tratando de hacer un dblink como lo dice en la guia y me encuentro que cuando hago un select a la base remota me sale el siguiente error:
ora-12560:TSN:error del adaptador de protocolo
cual sera el problema, desde ya muchas gracias

Juan Mellado, 11 Marzo, 2011 - 17:14

Es complicado responder sin una traza más detallada, pero a priori me arriesgaría a pensar que la base de datos "local" no sabe como conectarse a la "remota".

Si ese es el caso, hay que comprobar que en el fichero "tnsnames.ora" del servidor donde se encuentra la base de datos "local" aparece el connect string indicado en el USING del dblink para conectarse a la base de datos "remota".

Rol
Pepe (no verificado), 13 Abril, 2011 - 23:26

Y que quieres decir con Rol por que yo tengo varios roles para asignar (JAVAADMIN, OLAP_DBA ETC)

Juan Mellado, 14 Abril, 2011 - 18:07

Como dice el artículo, en vez asignarle los permisos de conexión, acceso, etc... al usuario directamente, lo que se suele hacer es crear un role y centralizar todos los permisos en él.

Pepe (no verificado), 20 Abril, 2011 - 00:31

Listo, ! me sirvió de maravilla tu mini tutorial del DBLINK.

MIL GRACIAS!

Rafael Obregon (no verificado), 21 Septiembre, 2011 - 03:21

COMO RESUELVO EL PROBLEMA CUANDO LAS BD DESTINO NO SON ORACLE?

GRACIAS

Anónimo (no verificado), 22 Diciembre, 2011 - 20:09

Creo el dblink con la instruccion tal cual lo indica la pag.
pero cuando trato de leer una tabla de la otra BD me arroja este error
ORA-12514: TNS:listener does not currently know of service requested in connect descriptor

Juan Mellado, 22 Diciembre, 2011 - 20:20

Revisa la documentación del error: http://ora-12514.ora-code.com/. En particular el apartado "Actions".

Anónimo (no verificado), 16 Marzo, 2012 - 16:57

gracias por su tiempo en ayudarnos y lo practico en la solución.
:o)

KQC (no verificado), 16 Marzo, 2012 - 17:02

Muy practico y entendible .. gracias por la explicación..
.o)

Anónimo (no verificado), 1 Mayo, 2012 - 00:11

Excelente aportación, súper claro y sencillo. saludos...

Cristina (no verificado), 6 Junio, 2012 - 22:01

Existe la posibilidad de hacer un dblink o algo parecido de informix a oracle, al reves si que lo he conseguido

RaulC (no verificado), 26 Junio, 2012 - 15:32

Muy claro. Muchas gracias.

Anónimo (no verificado), 18 Abril, 2013 - 16:51

Muy clara tu explicación sigue adelante.

Anónimo (no verificado), 6 Agosto, 2013 - 20:34

Excelente soy novata y me ha ayudado mucho, gracias por la informacion y saludos

Anónimo (no verificado), 22 Agosto, 2013 - 00:40

Pregunta: por ahi es una estupidez pero pregunto de todas formas. Se puede hacer dblinks a pkg, sp, funciones?
O solo son a tablas?
Desde ya muchas gracias

Juan Mellado, 26 Agosto, 2013 - 17:08

Sí, se pueden hacer dblinks a lo que se quiera. Fíjate que en el artículo se muestra un ejemplo con vistas, no con tablas.