DBlink : interroger une base distante

Un DBlink est un objet Oracle permettant de créer un lien entre plusieurs base de données Oracle, ce lien peut être sur le même hôte, sur un hôte appartenant au domaine ou sur tout autre hôte joignable par le protocole TCP/IP.

Pour créer un DBLink, il faut que le tnsname.ora soit correctement renseigné concernant le SID de la base distante :

CREATE PUBLIC DATABASE LINK bdddist
CONNECT TO SCOTT IDENTIFIED BY 'tiger' USING 'sidbdddist';


Pour l'interroger, il suffit d'ajouter 'arobase' et le nom du DBlink :
select * from tab1@bdddist;

ou, pour une table (vue) d'un autre owner :

select * from USEREX.tab1@bdddist;

On peut ainsi utiliser cette méthode pour la réplication d'une table d'une base à une autre :

create table tab1 as select * from tab1@bdddist;

Ce genre de DBlink ne peut être créé qu'avec un profil sysdba, un utilisateur peut se créer ses propres DBlink (si l'administrateur le lui a permis) ; il s'agit alors de DBlink privé et non publique :

Avec sysdba :
GRANT CREATE DATABASE LINK TO USEREX


Utilisateur USEREX :
CREATE DATABASE LINK bdddist CONNECT TO SCOTT IDENTIFIED BY 'tiger' USING 'sidbdddist';

Si la base distante que l'on veut interroger a la même chaîne de connexion que la base courante :
CREATE DATABASE LINK bdddist USING 'sidbdddist';

Dans la limite des droits accordés, une fois le dblink créé, on peut utiliser tous les objets de la même manière que s'ils était sur la base locale (vues, index, contraintes, ...) juste en préfixant le nom.

Il est possible de faire des jointures entre une table distante et une table local :

select a.c1, a.c2, b.c2 from USEREX.tab1@bdddist b
INNER JOIN tabloc a on a.c1 = b.c1;


un hint spécifique (DRIVING_SITE) permet d'indiquer alors si l'opération de jointure se fait coté local ou distant : on choisira généralement le traitement du coté de la table la plus volumineuse (après application du filtre) afin de diminuer le traffic et améliorer les temps de réponse :

En local
select /*+DRIVING_SITE(a)*/
a.c1, a.c2, b.c2 from USEREX.tab1@bdddist b
INNER JOIN tabloc a on a.c1 = b.c1;


En distant :
select /*+DRIVING_SITE(b)*/
a.c1, a.c2, b.c2 from USEREX.tab1@bdddist b
INNER JOIN tabloc a on a.c1 = b.c1;



Connaître les DBlink de notre base

Pour celà, on peut interroger le dictionnaire et la vue correspondante :
En sysdba :
select * from dba_db_links;


Créer un DBlink sans utiliser le tnsnames.ora

Parfois, pour une opération ponctuelle ou en raison du fait que l'on ait pas accès au système d'exploitation pour éditer le tnsnames.ora, il est possible de créer un DBLink directement en utilisant la chaîne de connexion complète :

create database link l_dist connect to USEREX identified by PASSEX using
'(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.29)(PORT = 1521))
)
(CONNECT_DATA =
(SID = ORAEX)
(SERVER = DEDICATED)
)
)'
;




Vous n'avez pas trouver réponse à votre question ? Préciser votre recherche :

Catégories