
{"id":209,"date":"2008-11-26T01:27:45","date_gmt":"2008-11-26T00:27:45","guid":{"rendered":"http:\/\/dasini.net\/blog\/?p=209"},"modified":"2008-11-30T17:37:52","modified_gmt":"2008-11-30T16:37:52","slug":"mysql-5-les-vues-part-27","status":"publish","type":"post","link":"https:\/\/dasini.net\/blog\/2008\/11\/26\/mysql-5-les-vues-part-27\/","title":{"rendered":"MySQL 5 : Les vues &#8212; (part 2\/7)"},"content":{"rendered":"<p><!-- \t \t --><\/p>\n<address>(<a title=\"MySQL 5 : Les vues -- (part 1\/7)\" href=\"http:\/\/dasini.net\/blog\/2008\/11\/23\/mysql-5-les-vues-part-17\/\">&lt;- pr\u00e9c\u00e9dent<\/a>)<\/address>\n<h2>Syntaxe d&rsquo;une vue<\/h2>\n<h3>CREATE VIEW<\/h3>\n<p><!-- \t \t --><br \/>\nLa commande MySQL pour cr\u00e9er une vue est assez proche de la syntaxe du standard SQL.<br \/>\n<!-- \t \t --><\/p>\n<pre><strong>CREATE VIEW nom_de_la_vue AS requ\u00eate_select<\/strong><\/pre>\n<p><!-- \t \t --><\/p>\n<pre>CREATE TABLE etudiant (<\/pre>\n<pre>id_etudiant int unsigned primary key,<\/pre>\n<pre>nom char(30),<\/pre>\n<pre>prenom char(30),<\/pre>\n<pre>age tinyint unsigned,<\/pre>\n<pre>cursus enum('Licence', 'Master', 'Doctorat'));<\/pre>\n<p><!-- \t \t --><\/p>\n<pre>CREATE VIEW v_etudiant_liste AS SELECT nom, prenom FROM etudiant;<\/pre>\n<p><!-- \t \t --><br \/>\nApr\u00e8s avoir cr\u00e9\u00e9 la table <strong>etudiant<\/strong>, on cr\u00e9e la vue <strong>v_etudiant_liste<\/strong> qui contient le nom et le pr\u00e9nom des \u00e9tudiants.<\/p>\n<p><!-- \t \t --><br \/>\nIl est possible d&rsquo;ajouter d&rsquo;autres informations lors de la cr\u00e9ation de la vue:<\/p>\n<pre>CREATE<\/pre>\n<pre>[OR REPLACE]<\/pre>\n<pre>[ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]<\/pre>\n<pre>[DEFINER = { user | CURRENT_USER }]<\/pre>\n<pre>[SQL SECURITY { DEFINER | INVOKER }]<\/pre>\n<pre>VIEW nom_de_la_vue [(colonne(s))]<\/pre>\n<pre>AS requ\u00eate_select<\/pre>\n<pre>[WITH [CASCADED | LOCAL] CHECK OPTION]<\/pre>\n<p><!-- \t \t --><br \/>\nVoici dans le d\u00e9tail les diff\u00e9rentes clauses.<br \/>\n<!-- \t \t --><\/p>\n<p><strong>OR REPLACE<\/strong><\/p>\n<p>Si une vue du m\u00eame nom existe, elle est alors supprim\u00e9e et remplac\u00e9e par la nouvelle.<br \/>\n<!-- \t \t --><\/p>\n<p><em><strong>ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}<\/strong><\/em><\/p>\n<p>Clause non standard, qui prend les valeurs suivantes:<\/p>\n<ul>\n<li>UNDEFINED : C&rsquo;est la valeur par \td\u00e9faut. MySQL d\u00e9cide lui-m\u00eame quel algorithme choisir entre MERGE \tet TEMPTABLE.<\/li>\n<li>MERGE : utilise la requ\u00eate SQL \tayant servie \u00e0 la cr\u00e9ation de la vue comme base d&rsquo;op\u00e9ration. En \td&rsquo;autres termes, faire une requ\u00eate sur la vue revient \u00e0 faire la \tm\u00eame requ\u00eate sur la ou les tables sous-jacentes.<\/li>\n<li>TEMPTABLE : utilise une table \ttemporaire cr\u00e9\u00e9e pour stocker (temporairement) les r\u00e9sultats. Un \tint\u00e9r\u00eat de cet algorithme est de lib\u00e9rer plus rapidement les \tverrous sur les tables sous-jacentes. Les autres requ\u00eates sont \talors moins p\u00e9nalis\u00e9es.<\/li>\n<\/ul>\n<p>Il faut noter \u00e9galement qu&rsquo;une vue avec pour valeur MERGE sera modifiable alors qu&rsquo;avec la valeur TEMPTABLE elle ne le sera pas.<br \/>\n<!-- \t \t --><\/p>\n<p><em><strong>DEFINER = { user | CURRENT_USER }<\/strong><\/em><\/p>\n<p>Clause non standard qui permet d&rsquo;assigner un cr\u00e9ateur \u00e0 la vue. Par d\u00e9faut, le cr\u00e9ateur de la vue est DEFINER = current_user, c&rsquo;est-\u00e0-dire, l&rsquo;utilisateur qui ex\u00e9cute la commande CREATE VIEW. Il est cependant possible d&rsquo;assigner la vue \u00e0 un autre compte utilisateur, \u00e0 condition d&rsquo;avoir le droit SUPER.<br \/>\n<!-- \t \t --><\/p>\n<p><em><strong>SQL SECURITY { DEFINER | INVOKER }<\/strong><\/em><\/p>\n<p>Clause non standard qui permet de d\u00e9finir quels seront les droits de l&rsquo;utilisateur, lors de l&rsquo;ex\u00e9cution de la vue. Deux valeurs sont possibles:<\/p>\n<ul>\n<li>DEFINER qui permet d&rsquo;ex\u00e9cuter la \tvue avec les droits du cr\u00e9ateur. C&rsquo;est la valeur par d\u00e9faut.<\/li>\n<li>INVOKER qui permet d&rsquo;ex\u00e9cuter la \tvue avec ses propres droits.<\/li>\n<\/ul>\n<p><!-- \t \t --><\/p>\n<p><em><strong>WITH [CASCADED | LOCAL] CHECK OPTION<\/strong><\/em><\/p>\n<p>Permet de v\u00e9rifier les contraintes sp\u00e9cifi\u00e9es dans la clause WHERE d&rsquo;une vue modifiable lorsque l&rsquo;on y modifie ses donn\u00e9es. Deux valeurs sont possibles:<\/p>\n<ul>\n<li>CASCADED, la valeur par \td\u00e9faut. Elle permet de v\u00e9rifier la contrainte pour la vue ainsi \tque pour les vues sous-jacentes dont elle d\u00e9rive.<\/li>\n<li>LOCAL qui permet de v\u00e9rifier \tseulement la contrainte de la vue.<\/li>\n<\/ul>\n<p><!-- \t \t --><\/p>\n<h3>ALTER VIEW<\/h3>\n<p><!-- \t \t --><br \/>\nUne fois la vue cr\u00e9\u00e9e, il est bien \u00e9videment possible de la modifier avec la commande ALTER VIEW.<\/p>\n<pre>ALTER definer='secretaire'@'localhost' VIEW v_etudiant_liste AS SELECT nom, prenom, cursus FROM etudiant;<\/pre>\n<p>Cette commande modifie la clause DEFINER en lui assignant le compte secretaire@localhost  et modifie la d\u00e9finition de la vue en rajoutant le champ cursus.<br \/>\n<!-- \t \t --><\/p>\n<h3>DROP VIEW<\/h3>\n<p><!-- \t \t --><br \/>\nPermet d&rsquo;effacer une vue.<\/p>\n<pre>DROP VIEW v_etudiant_liste, v_prof_liste;<\/pre>\n<p>Supprime les vues v_etudiant_liste et v_prof_liste. Il est possible d&rsquo;ajouter la clause IF EXISTS qui retourne un avertissement au lieu d&rsquo;une erreur si la vue \u00e0 effacer n&rsquo;existe pas.<\/p>\n<p><em>(<a title=\"MySQL 5 : Les vues -- (part 3\/7)\" href=\"http:\/\/dasini.net\/blog\/2008\/11\/30\/mysql-5-les-vues-part-37\/\">\u00e0 suivre&#8230; les restrictions pour cr\u00e9er une vue<\/a>)<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Syntaxe d&rsquo;une vue<br \/>\nCREATE VIEW<\/p>\n<p>La commande MySQL pour cr\u00e9er une vue est assez proche de la syntaxe du standard SQL.<\/p>\n<p>CREATE VIEW nom_de_la_vue AS requ\u00eate_select<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"footnotes":""},"categories":[8],"tags":[241,58],"class_list":["post-209","post","type-post","status-publish","format-standard","hentry","category-mysql","tag-mysql","tag-vue"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9LfWW-3n","jetpack-related-posts":[{"id":304,"url":"https:\/\/dasini.net\/blog\/2008\/12\/08\/mysql-5-les-vues-part-47\/","url_meta":{"origin":209,"position":0},"title":"MySQL 5 : Les vues &#8212; (part 4\/7)","author":"Olivier DASINI","date":"8 d\u00e9cembre 2008","format":false,"excerpt":"Voici quelques exemples pratiques tr\u00e8s simples pour illustrer les diff\u00e9rents besoins auxquels peuvent r\u00e9pondre les vues. On aura ici, une vue administrateur de base de donn\u00e9es. Les objets cr\u00e9\u00e9s ne seront pas utilis\u00e9s directement par les utilisateurs mais aux travers d'une application","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":192,"url":"https:\/\/dasini.net\/blog\/2008\/11\/23\/mysql-5-les-vues-part-17\/","url_meta":{"origin":209,"position":1},"title":"MySQL 5 : Les vues &#8212; (part 1\/7)","author":"Olivier DASINI","date":"23 novembre 2008","format":false,"excerpt":"Le langage SQL acronyme de Structured Query Language (Langage Structur\u00e9 de Requ\u00eates), a \u00e9t\u00e9 con\u00e7u pour g\u00e9rer les donn\u00e9es dans un SGBDR. A l'aide des DML (Data Manipulation Language ie les requ\u00eates SELECT, INSERT, UPDATE, DELETE) il est possible de manipuler ces donn\u00e9es qui sont stock\u00e9es dans des tables. SQL\u2026","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":14,"url":"https:\/\/dasini.net\/blog\/2008\/10\/28\/mysql-50-un-sgbdr-mature-part-24\/","url_meta":{"origin":209,"position":2},"title":"MySQL 5.0 : Un SGBDR mature ? &#8212; (part 2\/4)","author":"Olivier DASINI","date":"28 octobre 2008","format":false,"excerpt":"Les vues sont la plupart du temps utiles pour donner aux utilisateurs l\u2019acc\u00e8s \u00e0 un ensemble de relations repr\u00e9sent\u00e9es sous la forme d'une table. Une vue est une table virtuelle ; les donn\u00e9es de la vue sont en fait des champs de diff\u00e9rentes tables regroup\u00e9es, ou des r\u00e9sultats d\u2019op\u00e9rations sur\u2026","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":691,"url":"https:\/\/dasini.net\/blog\/2009\/07\/29\/utiliser-xml-avec-mysql-5-1-part-25\/","url_meta":{"origin":209,"position":3},"title":"Utiliser XML avec MySQL 5.1 (part 2\/5)","author":"Olivier DASINI","date":"29 juillet 2009","format":false,"excerpt":"Ins\u00e9rer du XML dans MySQL Un fichier XML, n'est finalement qu'un fichier contenant du texte et ins\u00e9rer du texte dans un SGBDR, est loin d'\u00eatre la chose la plus difficile. Une simple requ\u00eate INSERT fait l'affaire. Cela nous donne quelque chose comme ceci : INSERT INTO ma_table (champ_texte) VALUES ('...')","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":403,"url":"https:\/\/dasini.net\/blog\/2009\/01\/13\/mysql-5-les-vues-part-77\/","url_meta":{"origin":209,"position":4},"title":"MySQL 5 : Les vues &#8212; (part 7\/7)","author":"Olivier DASINI","date":"13 janvier 2009","format":false,"excerpt":"Conserver la structure d'une table si elle doit \u00eatre modifi\u00e9e La probl\u00e9matique est de mettre \u00e0 jour le sch\u00e9ma de l'application en changeant la structure de certaines tables.","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":381,"url":"https:\/\/dasini.net\/blog\/2009\/01\/07\/mysql-5-les-vues-part-67\/","url_meta":{"origin":209,"position":5},"title":"MySQL 5 : Les vues &#8212; (part 6\/7)","author":"Olivier DASINI","date":"7 janvier 2009","format":false,"excerpt":"Modifier automatiquement des donn\u00e9es s\u00e9lectionn\u00e9es Pour ce troisi\u00e8me exemple, nous allons nous int\u00e9resser au sch\u00e9ma (l\u00e0 encore tr\u00e8s simplifi\u00e9) d'une application qui permet de vendre des produits en France et au Royaume-Uni, en euro, livre et dollar. Cette application poss\u00e8de une table produit, qui contient le produit (son identifiant) et\u2026","rel":"","context":"Dans &quot;MySQL&quot;","block_context":{"text":"MySQL","link":"https:\/\/dasini.net\/blog\/category\/mysql\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/209","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/comments?post=209"}],"version-history":[{"count":20,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/209\/revisions"}],"predecessor-version":[{"id":224,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/209\/revisions\/224"}],"wp:attachment":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/media?parent=209"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/categories?post=209"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/tags?post=209"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}