- DBLink
-
Dans un Système de Gestion de Base de Données (SGBD) tel qu'Oracle, 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.
Sommaire
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. Pour faire court, nous dirons qu'un dblink 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 dblink :
- Les dblink 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 dblink 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 dblink globaux ;
Identification des dblink de la base
La syntaxe de visionnement des dblink déjà existant dans une base est comme suit :
SQL> select * from dba_db_links; SQL> select owner, db_link, username from dba_db_links;
Création d'un dblink
La syntaxe SQL de création d'un dblink se présente comme suit :
SQL> 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ù :
- On utilise l'option CONNECT TO si on veut 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 à laquelle le dblink se réfère, 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 :
SQL> ALTER DATABASE RENAME GLOBAL_NAME TO <database>.<domain> ;
Bien sûr, 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 :
SQL> 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:
SQL> 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:
SQL> CREATE [PUBLIC] DATABASE LINK nomdb CONNECT TO scott IDENTIFIED BY tiger USING 'db2' ;
Ou
SQL> 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):
SQL> select CLIENT_CODE from MYSCHEMA.CLIENTS@MY_DB_LINK;
Lien externe
Wikimedia Foundation. 2010.