DBLink
Dans un système de gestion de base de données (SGBD), tel qu'Oracle Database ou PostgreSQL, un DBLink, ou database link est un objet d'une base de données permettant d'exécuter des requêtes sur une autre base de données, qu'elle se trouve physiquement sur la même machine ou qu'elle soit distante.
Généralités sur les liens entre bases de données
Un DBLink est un objet de schéma qui fait qu'Oracle se connecte à une base de données distante pour y accéder. C'est un pointeur local qui permet à l'utilisateur d'accéder aux objets d'une base de données distante.
On distingue trois types de DBLinks :
- Les DBLinks privés ; c'est le type de DBLink qui est créé par défaut lorsque l'utilisateur ne donne aucune précision sur le type, en particulier quand il ne précise pas le mot-clé PUBLIC lors de la création. Seul l'utilisateur qui a créé ce lien peut alors l'utiliser ;
- Les DBLinks publics ; créé lorsque l'utilisateur précise le type par le mot-clé PUBLIC. Dans ce cas, ce lien sera utilisable par d'autres utilisateurs ;
- Les DBLinks globaux ;
Identification des DBLinks de la base
La syntaxe de visionnement des DBLinks déjà existant dans une base est :
select * from dba_db_links; select owner, db_link, username from dba_db_links;
Une vue interne à Oracle, uniquement accessible à l'utilisateur SYS permet de visualiser la date de création ainsi que le mot de passe sous forme crypté.
select NAME, CTIME, HOST, PASSWORD from sys.link$;
Création d'un DBLink
La syntaxe SQL de création d'un DBLink se présente comme suit :
CREATE [PUBLIC] DATABASE LINK <nom de lien de base de données> [CONNECT TO <utilisateur oracle> IDENTIFIED BY <mot de passe utilisateur oracle distant>] USING '<chaîne de base de données>' ;
OĂą :
- L'option CONNECT TO permet d'accéder à la base distante avec un nom d'utilisateur différent de celui en cours dans la session de la base locale.
- <nom de lien de base de données> correspond au nom de la base de données vers laquelle le DBLink pointe, si le paramètre GLOBAL_NAMES vaut 'true'. Sinon, un identifiant quelconque peut être utilisé.
- <chaîne de base de données> est une chaîne de connexion SQL*NET valide (par exemple, sous Oracle, trouvée dans le fichier tnsnames.ora).
Contraintes sur le nom de la base
Le nom du lien créé peut ne pas être libre : dans un système distribué de base de données, chaque base devrait avoir un nom global unique, qui l'identifie dans le système. Le nom du lien doit alors être le nom global de la base distante.
Dans ce cas, sur la base de données distante, le paramètre d'initialisation dynamique global_names, de type booléen, doit être positionné à 'true' (sa valeur par défaut est 'false').
Le nom global de la base distante se trouve dans la vue du dictionnaire de données GLOBAL_NAME, qui ne contient en général qu'une seule ligne et une seule colonne du même nom. Ce nom global comprend deux composants : le nom de la base et le nom du domaine, déterminés respectivement par les paramètres :
- DB_NAME: nom de la base, doit comporter huit caractères au plus (exemple : stocksDB);
- DB_DOMAIN: nom du domaine, doit suivre les conventions standard d'internet (exemple : magasin-truc.fr).
Note : le paramètre DB_DOMAIN est utilisé seulement lors de la création de la base de données, avec le paramètre DB_NAME. À partir de ce moment le nom global de la base est stocké dans le dictionnaire de données. Après la création, le changement du paramètre d'initialisation DB_DOMAIN n'a aucun effet sur le nom global de la base ou sur la résolution des noms de dblink. C'est pourquoi, pour changer le domaine dans un nom global de base de données, il faut changer le nom global lui-même, avec la commande :
ALTER DATABASE RENAME GLOBAL_NAME TO <database>.<domain> ;
Après un tel changement il est souhaitable de modifier le paramètre DB_DOMAIN pour qu'il reflète le changement du nom de domaine avant le prochain redémarrage de la base.
Pour déterminer si le nommage global est forcé sur une base de données, on peut, soit examiner le fichier de paramètres d'initialisation de la base, soit lancer la commande sql 'show parameter <nom_du_paramètre>', soit interroger la vue de dynamique v$parameter comme indiqué dans la requête qui suit :
select name, value from v$parameter where name='global_names' ;
Pour visualiser un nom global de base de données, on utilise la vue du dictionnaire de données GLOBAL_NAME avec la requête suivante:
select * from GLOBAL_NAME ;
Exemple
Disposant d'une base locale appelée locale_db et souhaitant pouvoir se connecter, depuis cette base locale, à la base distante distante_db. La définition du nom de service (alias) de la base distante dans le fichier tnsnames.ora de la machine locale se présente comme suit :
db2= (DESCRIPTION= (ADDRESS_LIST= (ADDRESS=(PROTOCOL=TCP)(HOST=adresse distante)(PORT=port distant) ) ) (CONNECT_DATA= (SID=distante_db) ) )
Les analyses sur la base distante donnant :
db_name | global_names | global_name |
---|---|---|
nomdb | true | ailleurs.world |
Pour créer un DBLink dans ce contexte, l'utilisateur pourra utiliser l'une des deux syntaxes suivantes :
CREATE [PUBLIC] DATABASE LINK nomdb CONNECT TO scott IDENTIFIED BY tiger USING 'db2' ;
Ou
CREATE [PUBLIC] DATABASE LINK nomdb CONNECT TO scott IDENTIFIED BY tiger USING 'db2.world' ;
Utilisation après création
Pour ensuite utiliser un lien de base de données, il suffit de préciser le lien utilisé, précédé du symbole '@', avant l'identifiant de l'objet distant.
Exemple
Par exemple, souhaitant obtenir la liste des codes clients (CLIENT_CODE de schéma MYSCHEMA) de la table CLIENTS se trouvant sur une autre instance (accessible par le lien nommé MY_DB_LINK):
select CLIENT_CODE from MYSCHEMA.CLIENTS@MY_DB_LINK;
Lien externe
- (en) DBLINK sur docs.oracle.com