Sie sind auf Seite 1von 25

Mysql

Les nouveauts de MySQL 5.0

Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Introduction
Sortie en Octobre 2005, la version 5 de MySQL reprsente certainement l'volution la plus significative de ce MySQL depuis ses dbuts. Malgr des lacunes importantes, les progrs effectus en termes de respect du standard SQL ne sont pas ngligeables. MySQL prend dsormais en charge les fonctionnalits prcieuses que sont les procdures stockes, les vues, ainsi que des triggers rudimentaires et un dictionnaire de donnes information_schema . Pour illustrer tout cela, prenons un exemple concret : la gestion des matches de Ligue 1 du championnat de France de football. Site web de pronostics, nous possdons pour le moment 2 tables simples. CREATE DATABASE ligue1; CREATE TABLE ligue1.equipe ( id_equipe int primary key auto_increment, nom varchar(50) not null, stade varchar(50) not null, ville varchar(30) not null, points int not null default 0, buts int not null default 0) ENGINE=MyISAM; CREATE TABLE ligue1.rencontre ( id_domicile int, id_visiteurs int, date_match DATETIME, score_domicile tinyint, score_visiteurs tinyint, arbitre varchar(80), primary key (id_domicile, id_visiteurs, date_match)) ENGINE=MyISAM;

Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Introduction
Les donnes pourraient ressembler cela : quipes

Rencontres

Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Les procdures Stockes :


Les procdures et fonctions stockes (Stored Procedures, en abrg SP) sont du code applicatif entrepos et excut au sein du serveur de base de donnes. Ce code combine commandes SQL, structures de contrle, variables, tout comme une fonction ou mthode dans n'importe quel langage de programmation. Les procdures MySQL sont crites selon la syntaxe standard SQL:2003. Pourquoi faire ? Rapidit. La squence des traitements contenus dans une procdure stocke est excute d'un bloc, au sein mme du SGBD. Par rapport un systme classique, on fait l'conomie d'un certain nombre d'aller-retours de donnes entre l'application cliente et le serveur, et donc de trafic rseau. Par ailleurs certaines tapes pralables comme l'analyse syntaxique des requtes SQL sont effectues la cration de la procdure et ne sont plus ncessaires lors de l'excution, qui s'en trouve acclre. Scurit. Les procdures stockes limitent la marge de manuvre de l'utilisateur et permettent de matriser ses agissements. Il ne fait qu'appeler la procdure sans oprer directement sur les tables sous-jacentes, ce qui rduit par consquent le risque de mauvaises manipulations. Facilit de maintenance et portabilit. Avec les procdures stockes, une partie de la logique applicative est centralise sur le serveur de bases de donnes ; cet emplacement unique facilite la cration et la maintenance du code. De plus, toutes les applications clientes accdent aux procdures de manire uniforme, ce qui constitue un niveau d'abstraction apprciable. Il en dcoule qu'on peut changer de technologie client sans rcrire quoi que ce soit de cette partie du code.
Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Les procdures Stockes :


Procdure INIT_EQUIPE

mysql> DELIMITER // mysql> CREATE PROCEDURE ligue1.INIT_EQUIPE ( mysql> nom_eq varchar(50), mysql> stade_eq varchar(50), mysql> ville_eq varchar(30) mysql> ) mysql> BEGIN mysql> INSERT INTO equipe (nom, stade, ville) mysql> VALUES (nom_eq, stade_eq, ville_eq); mysql> END mysql> //
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER;
La procdure prend en entre des paramtres d'un type donn, son corps est dlimit par les instructions BEGIN et END l'intrieur desquelles on effectue un certain nombre de traitements. Ici en l'occurrence, on se contente d'insrer une nouvelle quipe dont le nom, le stade et la ville ont t passs en paramtre.

Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Les procdures Stockes :


nous avons cr la procdure mais maintenant, comment s'en servir ? On utilise l'instruction SQL CALL sur la SP en donnant les valeurs voulues en paramtre : mysql> CALL INIT_EQUIPE('FC Girondins de Bordeaux', 'Chaban-Delmas', 'Bordeaux'); Query OK, 1 row affected (0.02 sec) En toute logique, les matchs vont tre renseigns en deux temps : 1)En dbut de saison, insertion des rencontres avec leurs dates prvues. 2)Modification avec saisie du score l'issue de chaque match. Crons donc 2 procdures qui nous mche le travail

Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Les procdures Stockes :


Delimiter // CREATE PROCEDURE ligue1.SAISIR_RENCONTRE ( id_dom INTEGER, id_vis INTEGER, date_m DATETIME, arbitre_m VARCHAR(80) ) BEGIN INSERT INTO rencontre (id_domicile, id_visiteurs, date_match, arbitre) VALUES (id_dom, id_vis, date_m, arbitre_m); END // Cette procdure sera appele par : mysql> CALL SAISIR_RENCONTRE(1, 2, '2006-02-04', 'Frank Sifflet');

Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Les procdures Stockes :


La gestion de l'issue du match va quand elle faire l'objet d'une procdure plus complexe puisque la mise jour ne concerne pas seulement la table rencontre. Elle affecte aussi les points du championnat, donc la table equipe :

CREATE PROCEDURE ligue1.SAISIR_RESULTAT( id_dom INTEGER, id_vis INTEGER, score_dom TINYINT(4), score_vis TINYINT(4)) BEGIN UPDATE rencontre SET score_domicile = score_dom, score_visiteurs = score_vis WHERE id_domicile=id_dom AND id_visiteurs=id_vis; IF score_dom = score_vis THEN UPDATE equipe SET points = points+1 WHERE id_equipe=id_dom OR id_equipe=id_vis; ELSEIF score_dom > score_vis THEN UPDATE equipe SET points = points+3 WHERE id_equipe = id_dom; ELSE UPDATE equipe SET points = points+3 WHERE id_equipe = id_vis; END IF; END
Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Les procdures Stockes :


mysql> CALL SAISIR_RESULTAT(4, 6, 2, 1); En clair : on met jour la table rencontre avec les valeurs des scores passes en paramtre, puis on rajoute un point chaque quipe en cas de match nul, ou sinon 3 points au vainqueur. L'utilisation de la condition IF - THEN - ELSE qui reste ici assez classique. Il peut galement tre intressant d'initialiser tous les matches ds le dbut de saison, avant de les renseigner. Concrtement, cela signifie insrer une rencontre pour chaque couple quipe domicile/quipe visiteurs distinct

Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Les procdures Stockes :


CREATE PROCEDURE ligue1.INIT_RENCONTRES() BEGIN DECLARE fini INT default 0; DECLARE domicile, visiteur INT; DECLARE cur_domicile CURSOR FOR SELECT id_equipe FROM equipe; DECLARE cur_visiteur CURSOR FOR SELECT id_equipe FROM equipe; DECLARE CONTINUE HANDLER FOR NOT FOUND SET fini = 1; OPEN cur_domicile; WHILE fini <> 1 DO FETCH cur_domicile INTO domicile; IF fini=0 THEN OPEN cur_visiteur; WHILE fini <> 1 DO FETCH cur_visiteur INTO visiteur; IF domicile <> visiteur AND fini <> 1 THEN INSERT INTO rencontre (id_domicile, id_visiteurs) VALUES (domicile, visiteur); END IF; END WHILE; CLOSE cur_visiteur; SET fini=0; END IF; END WHILE; CLOSE cur_domicile; END
Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Les procdures Stockes :


Quelques explications : Tout d'abord remarquez que la procdure ne prend aucun paramtre, ce qui est normal puisque tout ce dont on a besoin pour l'initialisation des matches se trouve dans la table equipe. L'instruction DECLARE sert, comme son nom l'indique, dclarer une variable interne la procdure. Les dclarations doivent tre places au dbut, avant les instructions de traitement. On peut dclarer des variables de type de base (INT, VARCHAR, etc.) comme dans les 2 premires lignes mais aussi des structures plus complexes comme les curseurs (CURSOR) et les HANDLERS. Un curseur est un objet permettant de parcourir squentiellement le jeu de rsultats retourn par une requte SQL. En l'occurrence, nous avons besoin de crer deux curseurs cur_domicile et cur_visiteur portant sur la mme requte SELECT id_equipe FROM equipe. Le parcours du deuxime curseur est plac l'intrieur du premier, de la mme manire que nous aurions imbriqu deux boucles for dans un autre langage pour passer en revue toutes les combinaisons de couples (equipe1, equipe2). Ainsi, pour chaque quipe domicile on parcourt toutes les quipes visiteuses qui vont jouer contre elle (c'est dire toutes sauf elle-mme) et on insre un nouveau match chaque fois. Le curseur est ouvert via l'ordre OPEN et ferm avec CLOSE. La syntaxe d'itration sur un curseur est un peu particulire ; elle repose sur une simple boucle WHILE dans laquelle on fait avancer le curseur (FETCH), et sur un HANDLER. Ce dernier sert dterminer ce qui se passe lorsque le SQLSTATE NOT FOUND est atteint, c'est dire quand le curseur est au bout du jeu de rsultats. En gnral on sort de la boucle WHILE.
Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Les Fonctions Stockes :


les fonctions se distinguent des procdures stockes par leur valeur de retour unique et obligatoire, et par la faon particulire de les excuter. En effet plus question de CALL, les fonctions sont utilisables directement l'intrieur de requtes SQL de DML (SELECT, INSERT, UPDATE...). Une fonction bien utile pourrait par exemple tre de savoir si une quipe passe en paramtre est dans les trois dernires du classement, et donc relgable en ligue 2 : CREATE FUNCTION EST_RELEGABLE (idequipe INTEGER) RETURNS TINYINT BEGIN DECLARE relegable TINYINT default 0; DECLARE id_courante INTEGER; DECLARE fini TINYINT DEFAULT 0; DECLARE cur1 CURSOR FOR SELECT id_equipe FROM equipe ORDER BY points ASC LIMIT 3; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET fini = 1; OPEN cur1; BOUCLE: REPEAT FETCH cur1 INTO id_courante; IF idequipe=id_courante THEN SET relegable=1; LEAVE BOUCLE; END IF; UNTIL fini END REPEAT BOUCLE; CLOSE cur1; RETURN relegable; END
Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Les Fonctions Stockes :


On peut maintenant appeler la fonction l o a nous chante : SELECT * FROM equipe WHERE EST_RELEGABLE(id_equipe)=1; donne un aperu des quipes relgables. DELETE FROM equipe WHERE EST_RELEGABLE(id_equipe)=1; permet de supprimer, en fin de saison par exemple, les quipes relgables. Restrictions Le support des procdures stockes est sans aucun doute un grand pas pour MySQL, mais il faut dire qu'en la matire cette version 5 ne fait pas dans le plthorique. Il manque certaines structures comme la boucle FOR, les curseurs sont limits (lecture seule, non-scrollables) et peu pratiques d'utilisation comme on l'a vu avec les Handler. Plus gnant, on dplorera que les SP soient quasi-autistes vis- -vis de leur environnement : pas de possibilit directe d'envoyer des messages systme ni de grer ou dclencher des erreurs, sans parler de fonctions plus avances comme la manipulation de fichiers. Un certain nombre d'ordres de maintenance tels que CHECK, LOAD DATA ou OPTIMIZE y sont eux aussi prohibs. En revanche bonne nouvelle, les ordres transactionnels (COMMIT, ROLLBACK) du moteur InnoDB sont autoriss l'intrieur des SP MySQL.

Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Les triggers :
Pour faire simple, les triggers (ou dclencheurs) sont des procdures qui s'activent automatiquement lorsqu'un vnement donn se produit sur une table. En d'autres termes, quand une requte INSERT, UPDATE ou DELETE survient, on se rserve la possibilit d'agir avant ou aprs son excution et ventuellement de modifier voire d'annuler son action. Cet outil puissant a souvent pour rle de vrifier certaines contraintes d'intgrit sophistiques que les contraintes SQL basiques (PRIMARY KEY, FOREIGN KEY, NOT NULL, DEFAULT...) sont incapables de grer. Quelques exemples : un client peut avoir au maximum 5 comptes bancaires (relation de cardinalit 1,5) ; un achat peut tre reli soit une carte de fidlit soit un coupon de rduction mais pas les deux ; il doit y avoir un intervalle de 15 minutes entre les horaires de dcollage de deux avions sur la mme piste ; etc. Tout a peut tre contrl par des trigger. Les triggers peuvent aussi servir mettre jour automatiquement certaines tables en fonction des modifications qui sont faites, ou formater des donnes comme nous allons le voir tout de suite.

Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Les triggers :
Crons un premier dclencheur qui va mettre la ville en majuscules lors de l'insertion d'une nouvelle quipe : CREATE TRIGGER TGR_BI_EQUIPE BEFORE INSERT ON equipe FOR EACH ROW BEGIN SET new.ville = UPPER(new.ville); END Comme pour les procdures stockes, le code du trigger est plac dans un bloc BEGIN ... END. Le mot-cl BEFORE indique que l'on souhaite agir avant que l'insertion ne soit ralise. La table telle qu'elle sera aprs l'excution du INSERT est dsigne par l'alias new, ce qui veut dire qu'on accde aux valeurs qui vont tre insres via new.nom_colonne. Modifier la valeur de new.nom_colonne revient transformer la requte INSERT d'origine selon nos exigences, c'est ce qu'on fait ici en forant la mise en majuscules. mysql> INSERT INTO equipe (nom, stade, ville) VALUES ('Racing Club Strasbourg', 'La Meinau', 'strasbourg'); Query OK, 1 row affected (0.00 sec) mysql> SELECT nom, stade, ville FROM equipe;
+--------------------------+-------------------------+---------------+ | nom | stade | ville +--------------------------+-------------------------+---------------+ | ... | ... | ... | | Racing Club Strasbourg | La Meinau | STRASBOURG | +--------------------------+-------------------------+---------------+
Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Les triggers :
Vous aurez peut-tre remarqu que dans la procdure stocke SAISIR_RESULTAT nous ne nous sommes pas soucis de la colonne equipe.buts. En effet, comme cette donne totalise les buts marqus par l'quipe durant le championnat, on peut tout fait la mettre jour l'aide d'un trigger sur la table rencontre (qui sera donc activ par SAISIR_RESULTAT) :
CREATE TRIGGER TGR_BU_RENCONTRE BEFORE UPDATE ON rencontre FOR EACH ROW BEGIN IF old.score_domicile IS NULL and new.score_domicile IS NOT NULL THEN UPDATE equipe SET buts = buts + new.score_domicile WHERE id_equipe=new.id_domicile; END IF; IF old.score_visiteurs IS NULL and new.score_visiteurs IS NOT NULL THEN UPDATE equipe SET buts = buts + new.score_visiteurs WHERE id_equipe=new.id_visiteurs; END IF; END

A l'inverse de new, old fait rfrence la table dans l'tat o elle tait juste avant que le trigger se dclenche. Dans notre exemple, on s'en sert pour savoir si le score vient d'tre rempli. En effet l'UPDATE pourrait simplement modifier le nom de l'arbitre ou la date, auquel cas equipe.buts ne doit pas tre mis jour
Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Les triggers :
mysql> SELECT nom, stade, points, buts FROM equipe WHERE id_equipe=1 OR id_equipe=2; +------------+-----------------+--------+------+ | nom | stade | points | buts | +------------+-----------------+--------+------+ | AC Ajaccio | Ren-Coty | 0 | 0 | | AJ Auxerre | l'Abb-Deschamp | 0 | 0 | +------------+-----------------+--------+------+ 2 rows in set (0.02 sec) mysql> CALL SAISIR_RESULTAT(1, 2, 2, 1); Query OK, 1 row affected (0.01 sec) mysql> SELECT nom, stade, points, buts FROM equipe WHERE id_equipe=1 OR id_equipe=2; +------------+-----------------+--------+------+ | nom | stade | points | buts | +------------+-----------------+--------+------+ | AC Ajaccio | Ren-Coty | 3 | 2 | | AJ Auxerre | l'Abb-Deschamp | 0 | 1 | +------------+-----------------+--------+------+ 2 rows in set (0.00 sec)

L aussi, on constate bien que les buts ont t mis jour en fonction du score qui vient d'tre saisi.
Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Les triggers :
Restrictions Comme je vous le disais en introduction, les triggers de MySQL 5 sont assez rudimentaires et ont un intrt limit au regard de leurs carences. Tout d'abord vrifier des contraintes d'intgrit implique d'avoir le pouvoir de "dire non" une requte lorsqu'elle les viole. Ceci se traduit en gnral par le dclenchement d'une exception systme qui fait avorter la requte en cours, et par le retour d'un message d'erreur SQL personnalis. Hlas, les procdures et dclencheurs MySQL ne permettent pour l'instant ni l'un ni l'autre. On ne peut pas non plus utiliser un ordre ROLLBACK dans le trigger pour annuler la transaction en cours. Limitation un seul trigger par table et par type d'vnement. Pas de possibilit de combiner plusieurs vnements (INSERT OR UPDATE...) Pas de clause WHEN. Uniquement triggers FOR EACH ROW (dclencheurs niveau ligne). Pas de dclencheurs sur des vnements systme autres que des requtes SQL.

Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Les vues :
D'un point de vue logique, une vue est une sorte de table virtuelle dont le contenu correspond au rsultat d'une requte SELECT. Elle se comporte comme une table en ce qui concerne l'accs ses donnes, c'est dire qu'on peut excuter des ordres SELECT, voire UPDATE ou DELETE dessus. Les vues ont plusieurs utilits. D'une part elles constituent une commodit d'criture pour l'utilisateur : une requte SELECT trs complexe peut tre manipule travers un nom de vue qui tient en un mot. Par ailleurs, les vues sont une faon simple et pratique de considrer les donnes contenues dans les tables sous un angle diffrent et personnalis. Ca permet aussi de dfinir des privilges beaucoup plus fins que de simples GRANT sur les tables. Par exemple, on peut refuser les droits un utilisateur sur une table, mais travers une vue adquate lui autoriser la consultation d'un nombre limit de colonnes ou de lignes issues de cette table. Physiquement, on ne stocke pas durablement les donnes d'une vue mais juste sa dfinition. Lorsqu'un ordre SQL (a) va interroger une vue dont la dfinition est une requte (b), il y a deux possibilits sous MySQL 5.0 :
L'algorithme MERGE est utilis. (a) et (b) sont combines pour former une nouvelle requte qui sera excute de faon classique. On opte pour l'algorithme TEMPTABLE. Une table temporaire est cre avec les rsultats de (b). La requte (a) est excute en se basant sur cette table temporaire. Cela a l'avantage de moins solliciter les tables physiques sous-jacentes.

On peut spcifier un algorithme la cration de la vue (ALGORITHM = MERGE | TEMPTABLE) ou ne rien dfinir et laisser le moteur choisir au cas par cas.

Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Les vues :
On peut tirer parti des vues pour avoir un aperu de la dernire journe de championnat : CREATE VIEW V_DERNIERES_RENCONTRES AS SELECT r.date_match, d.nom as nom_domicile, r.score_domicile, v.nom as nom_visiteurs, r.score_visiteurs, r.arbitre FROM equipe d, rencontre r, equipe v WHERE r.id_domicile = d.id_equipe AND r.id_visiteurs = v.id_equipe AND r.date_match <= CURDATE() ORDER BY r.date_match DESC LIMIT 10 La syntaxe est relativement simple : CREATE VIEW NOM_VUE suivi de AS et de la requte sur laquelle on veut se baser. La vue peut tre interroge grce un simple SELECT, ce qui donne l'impression d'avoir une vraie table personnalise contenant les 10 derniers matches :

Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Les vues :
mysql> SELECT * FROM V_DERNIERES_RENCONTRES;
+---------------------+--------------------------+----------------+----------------------+-----------------+---------------+ | date_match | nom_domicile | score_domicile | nom_visiteurs | score_visiteurs | arbitre | +---------------------+--------------------------+----------------+----------------------+-----------------+---------------+ | 2005-10-15 00:00:00 | FC Girondins de Bordeaux | 1 | FC Sochaux | 1 | Ren Carton | | 2005-10-15 00:00:00 | AJ Auxerre | 3 | Troyes ESTAC | 0 |John Maninblack| | 2005-10-15 00:00:00 | Le Mans Union Club 72 | 1 | LOSC Lille M?tropole | 1 | Frank Sifflet | | ... | ... | ... | ... | ... | ... | +---------------------+--------------------------+----------------+----------------------+-----------------+---------------+

10 rows in set (0.01 sec)

NB:un UPDATE ou un DELETE sur cette vue dclenchera une erreur car elle met en jeu plusieurs tables avec des jointures. Le moteur serait bien en peine de savoir quoi modifier et dans quelles tables, mme la modification aurait un sens. Supposons maintenant que notre projet quel qu'il soit ait pris de l'importance et qu'on ait t amen contacter les entraineurs de plusieurs clubs. On veut stocker leur numro de tlphone personnel dans la table equipe ALTER TABLE equipe ADD entraineur varchar(100) default 'inconnu', ADD tel_entraineur varchar(20) default 'inconnu'; UPDATE equipe SET entraineur='Ricardo GOMES', tel_entraineur='06-56-5656-56' WHERE id_equipe=4; UPDATE equipe SET entraineur='Grard Houllier', tel_entraineur='06-5757-57-57' WHERE id_equipe=9;
Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Les vues :
Cependant, ces numros de tlphone sont des donnes confidentielles qui ne doivent pas tre accessibles aux utilisateurs lambda. On va donc crer une vue o ne figure pas cette colonne .
CREATE VIEW V_EQUIPE AS SELECT id_equipe, nom, stade, ville, points, buts, entraineur FROM equipe

Donnons les droits sur cette vue un nouvel utilisateur GRANT SELECT, INSERT, DELETE, UPDATE ON V_EQUIPETO user1@localhost IDENTIFIED BY 'user1; Et vrifions l'efficacit de notre systme
> mysql -u user1 p > Enter password: > Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 31 to server version: 5.0.13-rc-standardType 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> use ligue1; Database changed mysql> SELECT * FROM V_EQUIPE;
+-----------+--------------------------+-------------------------+--------------+--------+------+----------------+ | id_equipe | nom | stade | ville | points | buts | entraineur | +-----------+--------------------------+-------------------------+---------------+--------+------+----------------+ | 1 | AC Ajaccio | Ren-Coty | Ajaccio | 8 | 3 | inconnu | | 2 | AJ Auxerre | l'Abb-Deschamp |

Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Les vues :
. Restrictions Les vues semblent tre la nouvelle fonction la plus aboutie de cette version. On peut dfinir leur algorithme sous-jacent, les vues correspondant une table unique sont updatables (avec possibilit de CHECK OPTION) et elles peuvent porter sur d'autres vues. Par contre les vues ne peuvent pas : Avoir d'index propres. Utiliser d'index lorsque leur algorithme est TEMPTABLE. Seule une opration MERGE utilise les index des tables sous-jacentes. Porter sur des tables temporaires. Avoir de sous-requte dans la clause FROM de leur dfinition (SELECT * FROM (SELECT...) ). Se voir associer des triggers. A l'exception de la premire, ces limitations ne devraient pas s'avrer trop gnantes.

Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

INFORMATION_SCHEMA :
Voyons l'utilisation du dictionnaire de donnes travers deux exemples. Tout d'abord, il peut tre apprciable pour un utilisateur du SGBD de connatre les privilges qu'il a sur les diffrentes tables.
mysql> use INFORMATION_SCHEMA; Database changed mysql> SELECT * FROM TABLE_PRIVILEGES;
+---------------------+---------------+------------+------------+----------------+--------------+ | GRANTEE | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | PRIVILEGE_TYPE | IS_GRANTABLE | +---------------------+---------------+------------+------------+----------------+--------------+ | 'user1'@'localhost' | NULL | ligue1 | rencontre | SELECT | NO | | 'user1'@'localhost' | NULL | ligue1 | rencontre | INSERT | NO | | 'user1'@'localhost' | NULL | ligue1 | rencontre | UPDATE | NO | | 'user1'@'localhost' | NULL | ligue1 | rencontre | DELETE | NO | | 'user1'@'localhost' | NULL | ligue1 | V_EQUIPE | SELECT | NO | | 'user1'@'localhost' | NULL | ligue1 | V_EQUIPE | INSERT | NO | | 'user1'@'localhost' | NULL | ligue1 | V_EQUIPE | UPDATE | NO | | 'user1'@'localhost' | NULL | ligue1 | V_EQUIPE | DELETE | NO | +---------------------+---------------+------------+------------+----------------+--------------+

8 rows in set (0.01 sec)

user1 connait maintenant la totalit de ses privilges sur les tables (et vues), ce qui peut tre bon savoir lorsque surviennent certains problmes de droits.

Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

INFORMATION_SCHEMA :
Mais notre utilisateur se pose des questions sur la vue V_EQUIPE. Que contient-elle vraiment ? Et bien une simple requte sur INFORMATION_SCHEMA.VIEWS va le renseigner sur sa structure : mysql> SELECT VIEW_DEFINITION FROM VIEWS WHERE TABLE_NAME = 'V_EQUIPE';
+-------------------------------------------------------------------------+ | VIEW_DEFINITION | +-------------------------------------------------------------------------+ | select `ligue1`.`equipe`.`id_equipe` AS `id_equipe`,`ligue1`.`equipe`.`nom` AS `nom`,`ligue1`.`equipe`.`stade` AS `stade`,`ligue1`.`equipe`.`ville` AS `ville`,`ligue1`.`equipe`.`points` AS `points`,`ligue1`.`equipe`.`buts` AS `buts`,`ligue1`.`equipe`.`entraineur` AS `entraineur` from `ligue1`.`equipe` | +-------------------------------------------------------------------------+ 1 row in set (0.00 sec)

Pour rsumer, INFORMATION_SCHEMA standardise les instructions d'accs aux mtadonnes qui existaient dj et en apporte de nouvelles. Vois doc officielle.

Cours PHP/MySQL L. P. IUT AMIENS 2005-2006

Das könnte Ihnen auch gefallen