Olivier El Mekki

Faire pointer une table mysql sur une autre

Vous avez déjà essayé d’intégrer une application maison dans une webapp opensource? Les bonnes webapp ont des systèmes de plugin qui permette de facilement les étendre, mais ce n’est pas toujours suffisant.

Je me suis retrouvé confronté à ce problème lorsque j’ai voulu intégrer un forum dans mediawiki. Réutiliser le design de mediawiki pour que l’utilisateur n’ait pas l’impression d’être sur une application différente est assez aisé, mais lorsqu’il s’agit de fusionner les sytèmes d’authentification… Je ne voulais certainement pas que mes utilisateurs doivent s’inscrire une fois sur le wiki, et une autre fois sur le forum.

Une solution est de donner au forum directement accès à la table de mediawiki, mais l’alerte de sécurité raisonne immédiatement dans ma tête à cette simple idée. Un forum n’a pas à avoir accès aux pages d’un wiki. Et comme j’ai écrit mon forum en rails, la dénomination des tables posait problème aussi.

La solution, c’est de faire pointer une table du forum sur la table des utilisateurs du wiki. Non, ce n’est pas si compliqué que ça.

Méthode

C’est même assez simple en utlisant le moteur MERGE de MySQL. Les tables MERGE sont utilisées pour faire une table A qui regroupe les informations d’un table B et d’une table C. C’est l’équivalent solide de la directive UNION d’une requête.

Faites pointer votre table A uniquement sur la table B, et A devient un lien vers B.

Il y a tout de même quelques contraintes :

Voici la démarche à suivre, appliquée au cas de mon forum :

USE forum_development ;
ALTER TABLE mediawiki.`mw_user` ENGINE=MyISAM ;
CREATE TABLE `authors` SELECT * FROM mediawiki.`mw_user` ;
DELETE FROM `authors` ;
ALTER TABLE `authors` ENGINE=MERGE ;
ALTER TABLE `authors` UNION=(mediawiki.`mw_user`) ;

La seconde ligne change le moteur de la table cible pour qu’il soit MyISAM.

La troisième et la quatrième ligne duplique la table cible et vide cette copie qui deviendra la table lien.Cela permet de facilement reproduire la structure de la cible.

La cinquième et la sixième ligne créent le lien en lui-même en changeant le moteur pour ENGINE et en associant la table cible.

C’est ainsi qu’on lie une table avec MySQL. L’application ayant les droits sur cette table pourra la modifier sans devoir avoir un quelconque droit sur la base de donnée de la table cible, et vous pouvez donnez le nom que vous voulez à la table lien, ce qui facilite grandement les choses avec ruby on rails.

Laisser un commentaire