
{"id":41,"date":"2008-10-30T19:20:37","date_gmt":"2008-10-30T17:20:37","guid":{"rendered":"http:\/\/dasini.net\/blog\/?p=41"},"modified":"2008-11-29T16:35:46","modified_gmt":"2008-11-29T15:35:46","slug":"mysql-50-un-sgbdr-mature-part-44","status":"publish","type":"post","link":"https:\/\/dasini.net\/blog\/2008\/10\/30\/mysql-50-un-sgbdr-mature-part-44\/","title":{"rendered":"MySQL 5.0 : Un SGBDR mature ? &#8212; (part 4\/4)"},"content":{"rendered":"<p><!-- \t\t@page { margin: 2cm } \t\tP { margin-bottom: 0.21cm } \t\tH5 { margin-bottom: 0.21cm } \t\tH5.western { font-family: \"Arial\", sans-serif; font-size: 11pt } \t\tH5.cjk { font-family: \"MS Mincho\"; font-size: 11pt } \t\tH5.ctl { font-family: \"Tahoma\"; font-size: 11pt } \t\tH3 { margin-bottom: 0.21cm } \t\tH3.western { font-family: \"Arial\", sans-serif } \t\tH3.cjk { font-family: \"MS Mincho\" } \t\tH3.ctl { font-family: \"Tahoma\" } --><\/p>\n<p class=\"western\">(<em><a title=\"MySQL 5.O, un SGBDR mature ? -- (part 3\/4)\" href=\"http:\/\/dasini.net\/blog\/2008\/10\/29\/mysql-50-un-sgbdr-mature-part-34\/\">&lt;- pr\u00e9c\u00e9dent<\/a><\/em>)<\/p>\n<h3 class=\"western\">D\u00e9clencheurs<\/h3>\n<p style=\"margin-bottom: 0cm;\">Les d\u00e9clencheurs (triggers) sont des ordres de d\u00e9clenchement d&rsquo;op\u00e9rations quand un \u00e9v\u00e8nement survient sur une table.<\/p>\n<h5 class=\"western\">Des d\u00e9clencheurs pour maintenir la coh\u00e9rence des donn\u00e9es<\/h5>\n<p style=\"margin-bottom: 0cm;\">Ils sont souvent utilis\u00e9s pour assurer la coh\u00e9rence des donn\u00e9es dans la base, en r\u00e9alisant des contraintes qui doivent porter sur plusieurs tables.<\/p>\n<p style=\"margin-bottom: 0cm;\">Les d\u00e9clencheurs combin\u00e9s aux transactions permettent de cr\u00e9er tous les m\u00e9canismes d&rsquo;int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle. La norme SQL 3 a d&rsquo;ailleurs impos\u00e9 l&rsquo;utilisation des d\u00e9clencheurs.<\/p>\n<p style=\"margin-bottom: 0cm;\">Initialement pr\u00e9vu pour la version 5.1, l&rsquo;\u00e9quipe de d\u00e9veloppement \u00e0 finalement profit\u00e9 d&rsquo;une avance sur le calendrier de d\u00e9veloppement pour proposer une version simplifi\u00e9 des d\u00e9clencheurs dans la version 5.0.<\/p>\n<h5 class=\"western\">Syntaxe de base<\/h5>\n<pre>CREATE TRIGGER trigger_nom\r\n[DEFINER = { user | CURRENT_USER }]\r\n{ BEFORE | AFTER }\r\n{ INSERT | UPDATE | DELETE }\r\nON table name\r\nFOR EACH ROW\r\ntriggered SQL statement<\/pre>\n<p><!-- \t\t@page { margin: 2cm } \t\tP { margin-bottom: 0.21cm } --><\/p>\n<p style=\"margin-bottom: 0cm;\">Le premier \u00e9l\u00e9ment entrant en compte est le nom (trigger_nom). L&rsquo;action qui est d\u00e9clench\u00e9e l&rsquo;est \u00e0 la suite d&rsquo;un \u00e9v\u00e8nement (ex : insertion d&rsquo;un nouvel enregistrement dans une table). Le second param\u00e8tre (BEFORE ou AFTER) indique si le d\u00e9clencheur doit \u00eatre lanc\u00e9 avant ou apr\u00e8s l&rsquo;\u00e9v\u00e8nement.<\/p>\n<p style=\"margin-bottom: 0cm;\">Les d\u00e9clencheurs peuvent \u00eatre activ\u00e9 durant l&rsquo;appel \u00e0 un INSERT, un UPDATE ou un DELETE.<\/p>\n<pre>CREATE TRIGGER trig_livre\r\nBEFORE INSERT<\/pre>\n<p><!-- \t\t@page { margin: 2cm } \t\tP { margin-bottom: 0.21cm } --><\/p>\n<p style=\"margin-bottom: 0cm;\">Le d\u00e9clencheur est li\u00e9 \u00e0 une table que nous d\u00e9finissons avec le mot clef ON :<\/p>\n<pre style=\"margin-bottom: 0cm;\">CREATE TRIGGER trig_livre\r\nBEFORE INSERT\r\nON livre<\/pre>\n<p style=\"margin-bottom: 0cm;\">\n<p style=\"margin-bottom: 0cm;\"><!-- \t\t@page { margin: 2cm } \t\tP { margin-bottom: 0.21cm } --><\/p>\n<p style=\"margin-bottom: 0cm;\">On d\u00e9finit alors les instructions \u00e0 effectuer une fois le d\u00e9clencheur activ\u00e9.<\/p>\n<pre>CREATE TRIGGER trig_livre\r\n\u00a0 BEFORE INSERT\r\n\u00a0 ON livre\r\n\u00a0 FOR EACH ROW\r\n\u00a0 BEGIN\r\n\u00a0 \u00a0\u00a0 INST1;\r\n\u00a0 \u00a0\u00a0 INST2;\r\n\u00a0 END;<\/pre>\n<p style=\"margin-bottom: 0cm;\">\n<p><!-- \t\t@page { margin: 2cm } \t\tP { margin-bottom: 0.21cm } --><\/p>\n<p style=\"margin-bottom: 0cm;\">Prenons un cas pratique :<\/p>\n<pre style=\"margin-bottom: 0cm;\">mysql&gt; CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));\r\nmysql&gt; CREATE TRIGGER ins_sum BEFORE INSERT ON account\r\n\u00a0\u00a0\u00a0 -&gt; FOR EACH ROW SET @sum = @sum + NEW.amount;<\/pre>\n<p style=\"margin-bottom: 0cm;\">\n<p style=\"margin-bottom: 0cm;\"><!-- \t\t@page { margin: 2cm } \t\tP { margin-bottom: 0.21cm } \t\tH4 { margin-bottom: 0.21cm } \t\tH4.western { font-family: \"Arial\", sans-serif; font-size: 11pt; font-style: italic } \t\tH4.cjk { font-family: \"MS Mincho\"; font-size: 11pt; font-style: italic } \t\tH4.ctl { font-family: \"Tahoma\"; font-size: 11pt; font-style: italic } --><\/p>\n<h4 class=\"western\">Limitation des d\u00e9clencheurs li\u00e9es \u00e0 la version 5.0<\/h4>\n<p style=\"margin-bottom: 0cm;\">Comme nous l&rsquo;avons indiqu\u00e9 plus amont le support des d\u00e9clencheurs est un plus dans la version 5.0 de MySQL : C&rsquo;\u00e9tait pr\u00e9vu pour la version 5.1. Il n&rsquo;en reste pas moins que c&rsquo;est une version light qui souffre \u00e0 ce jour de quelques limitations :<\/p>\n<ul>\n<li>\n<p style=\"margin-bottom: 0cm;\">On ne peut associer un d\u00e9clencheur \t\u00e0 une vue ou \u00e0 une table temporaire,<\/p>\n<\/li>\n<li>\n<p style=\"margin-bottom: 0cm;\">Les d\u00e9clencheurs ne peuvent pas \tnon plus faire appel \u00e0 une proc\u00e9dure stock\u00e9e ou \u00e0 des fonctions.<\/p>\n<\/li>\n<\/ul>\n<p style=\"margin-bottom: 0cm;\">\n<p style=\"margin-bottom: 0cm;\"><!-- \t\t@page { margin: 2cm } \t\tP { margin-bottom: 0.21cm } --><\/p>\n<p style=\"margin-bottom: 0cm; font-style: normal; text-decoration: none;\">\n<p style=\"margin-bottom: 0cm; font-style: normal; text-decoration: none;\"><span style=\"color: #000000;\"><span style=\"font-family: Times New Roman,serif;\"><span style=\"font-size: small;\"><strong>INFORMATION_SCHEMA<\/strong><\/span><\/span><\/span><\/p>\n<p style=\"margin-bottom: 0cm;\">\n<p style=\"margin-bottom: 0cm;\">La base INFORMATION_SCHEMA, standard du SQL:2003, fournit un acc\u00e8s aux m\u00e9tadonn\u00e9es du serveur MySQL.<\/p>\n<p style=\"margin-bottom: 0cm;\">Les m\u00e9tadonn\u00e9es sont les informations sur les donn\u00e9es, telles que le nom des bases de donn\u00e9es, le nom des tables, le type des donn\u00e9es, d&rsquo;index, les droits d&rsquo;acc\u00e8s, etc.<\/p>\n<p style=\"margin-bottom: 0cm;\">INFORMATION_SCHEMA est une base de donn\u00e9es virtuelle, vous ne pouvez y acc\u00e9der qu&rsquo;en lecture. En effet, les tables qui la composent, ne sont en fait que des vues. Vous ne verrez donc pas sur le disque dur de fichiers associ\u00e9s.<\/p>\n<p style=\"margin-bottom: 0cm;\">\n<pre style=\"margin-bottom: 0cm;\">Par exemple, pour r\u00e9cup\u00e9rer le code\r\ndes proc\u00e9dures stock\u00e9es, de la base de donn\u00e9es FRESHDAZ,  il faut\r\npour cela, s\u00e9lectionner les colonnes ROUTINE_NAME et\r\nROUTINE_DEFINITION de la table  information_schema.ROUTINES:<\/pre>\n<p>mysql&gt; SELECT R.ROUTINE_NAME, R.ROUTINE_DEFINITION<br \/>\n-&gt; FROM information_schema.ROUTINES R<br \/>\n-&gt; WHERE R.ROUTINE_TYPE = &lsquo;PROCEDURE&rsquo; AND R.ROUTINE_SCHEMA = &lsquo;FRESHDAZ&rsquo;;<\/p>\n<p><!-- \t\t@page { margin: 2cm } \t\tP { margin-bottom: 0.21cm } \t\tH3 { margin-bottom: 0.21cm } \t\tH3.western { font-family: \"Arial\", sans-serif } \t\tH3.cjk { font-family: \"MS Mincho\" } \t\tH3.ctl { font-family: \"Tahoma\" } \t\tH4 { margin-bottom: 0.21cm } \t\tH4.western { font-family: \"Arial\", sans-serif; font-size: 11pt; font-style: italic } \t\tH4.cjk { font-family: \"MS Mincho\"; font-size: 11pt; font-style: italic } \t\tH4.ctl { font-family: \"Tahoma\"; font-size: 11pt; font-style: italic } \t\tH2 { margin-bottom: 0.21cm } \t\tH2.western { font-family: \"Arial\", sans-serif; font-size: 14pt; font-style: italic } \t\tH2.cjk { font-family: \"MS Mincho\"; font-size: 14pt; font-style: italic } \t\tH2.ctl { font-family: \"Tahoma\"; font-size: 14pt; font-style: italic } --><\/p>\n<h3 class=\"western\">Goodies and co<\/h3>\n<h4 class=\"western\">Am\u00e9lioration des traitements math\u00e9matiques<\/h4>\n<p style=\"margin-bottom: 0cm;\">Avec MySQL 4.1 le r\u00e9sultat de la commande SELECT .01 * .01 renvoyait 0. MySQL 5 utilise une biblioth\u00e8que permettant des calculs plus pr\u00e9cis. Ainsi 0.0001 est trait\u00e9 comme une valeur exacte et non plus comme une valeur approximative.<\/p>\n<h4 class=\"western\">Nouveau moteur de stockage<\/h4>\n<p style=\"margin-bottom: 0cm;\">Un nouveau moteur de stockage a \u00e9t\u00e9 ajout\u00e9 depuis MySQL 5.0.3 : FEDERATED Storage Engine. Il permet d&rsquo;acc\u00e9der \u00e0 des donn\u00e9es pr\u00e9sentes sur des bases de donn\u00e9es distantes.<\/p>\n<h2 class=\"western\">Conclusion<\/h2>\n<p style=\"margin-bottom: 0cm;\">MySQL 5 apporte un r\u00e9el confort en terme de fonctionnalit\u00e9s par rapport \u00e0 ses versions ant\u00e9rieures. Les d\u00e9clencheurs, les vues et les proc\u00e9dures stock\u00e9es propulsent MySQL dans le monde des SGBD matures et permet de soutenir la comparaison avec Oracle, PostgreSQL et autres.<\/p>\n<p style=\"margin-bottom: 0cm;\">Avec cette nouvelle version MySQL \u00e9largit son public en ne s&rsquo;adressent plus  principalement aux architectes d&rsquo;applications Web mais \u00e0 tous les d\u00e9veloppeurs.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Les d\u00e9clencheurs (triggers) sont des ordres de d\u00e9clenchement d&rsquo;op\u00e9rations quand un \u00e9v\u00e8nement survient sur une table. <\/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":[20,21,241,12,14,19],"class_list":["post-41","post","type-post","status-publish","format-standard","hentry","category-mysql","tag-declencheur","tag-information_schema","tag-mysql","tag-mysql-5","tag-sgbd","tag-trigger"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p9LfWW-F","jetpack-related-posts":[{"id":1096,"url":"https:\/\/dasini.net\/blog\/2011\/08\/23\/numero-special-mysql-dans-phpsolutions\/","url_meta":{"origin":41,"position":0},"title":"Num\u00e9ro sp\u00e9cial MySQL dans phpsolutions","author":"Olivier DASINI","date":"23 ao\u00fbt 2011","format":false,"excerpt":"Le magazine phpsolutions propose ce mois-ci, un num\u00e9ro sp\u00e9cial \"Utilisez PHP avec MySQL\". Au sommaire: Introduction \u00e0 la s\u00e9curit\u00e9 et \u00e0 la gestion des utilisateurs avec MySQL par Olivier Dasini Introduction \u00e0 PHP\/MySQL et l'ORM Doctrine par Julien Tailleu Les moteurs de tables MyISAM et InnoDB depuis MySQL 5.5 par\u2026","rel":"","context":"Dans &quot;MariaDB&quot;","block_context":{"text":"MariaDB","link":"https:\/\/dasini.net\/blog\/category\/mariadb\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":641,"url":"https:\/\/dasini.net\/blog\/2009\/06\/29\/le-programmateur-d%e2%80%99evenements-event-scheduler-part-66\/","url_meta":{"origin":41,"position":1},"title":"Le programmateur d\u2019\u00e9v\u00e9nements ( Event Scheduler ) (part 6\/6)","author":"Olivier DASINI","date":"29 juin 2009","format":false,"excerpt":"Limitations et restrictions Certaines commandes MySQL ne sont pas permises dans un \u00e9v\u00e9nement. Verrouiller une table est interdit: LOCK TABLES, UNLOCK TABLES. Il n'est malheureusement pas possible de charger des donn\u00e9es avec la commande LOAD DATA INFILE. Les requ\u00eates pr\u00e9par\u00e9es (PREPARED STATEMENT) ne peuvent \u00eatre cr\u00e9\u00e9es dans un \u00e9v\u00e9nement.","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":127,"url":"https:\/\/dasini.net\/blog\/2008\/11\/14\/presentation-mysql-50-un-sgbdr-mature\/","url_meta":{"origin":41,"position":2},"title":"Pr\u00e9sentation : MySQL 5.0, un SGBDR mature ?","author":"Olivier DASINI","date":"14 novembre 2008","format":false,"excerpt":"MySQL est le SGBDR Open Source le plus populaire au monde. Sa cinqui\u00e8me version, sortie en octobre 2005, permet de mieux r\u00e9pondre aux probl\u00e9matiques d\u2019entreprise. Au menu des nouveaut\u00e9s fonctionnelles : les vues, les proc\u00e9dures stock\u00e9es, les d\u00e9clencheurs, de nouveaux moteurs de stockage, la base de donn\u00e9es INFORMATION_SCHEMA et diverses\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":11,"url":"https:\/\/dasini.net\/blog\/2008\/10\/27\/mysql-50-un-sgbdr-mature-part-14\/","url_meta":{"origin":41,"position":3},"title":"MySQL 5.0 : Un SGBDR mature ? &#8212; (part 1\/4)","author":"Olivier DASINI","date":"27 octobre 2008","format":false,"excerpt":"MySQL est le SGBD Open Source le plus populaire au monde. Sa cinqui\u00e8me version, sortie en octobre 2005, permet de mieux r\u00e9pondre aux probl\u00e9matiques d'entreprise. Au menu des nouveaut\u00e9s fonctionnelles :","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":622,"url":"https:\/\/dasini.net\/blog\/2009\/06\/16\/le-programmateur-devenements-event-scheduler-part-46\/","url_meta":{"origin":41,"position":4},"title":"Le programmateur d&rsquo;\u00e9v\u00e9nements ( Event Scheduler ) (part 4\/6)","author":"Olivier DASINI","date":"16 juin 2009","format":false,"excerpt":"Insertions de donn\u00e9es dans une table, toutes les 30 secondes mysql> SELECT * FROM _event.insert_event ; mysql> DELIMITER \u20ac\u20ac mysql> CREATE EVENT `_event`.`second_event` ON SCHEDULE EVERY 30 SECOND DO BEGIN \/*selectionne la val maximale de la colonne fois. Si elle vaut NULL alors retourne la valeur 0 dans la variable\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":237,"url":"https:\/\/dasini.net\/blog\/2008\/11\/28\/les-nouveautes-de-mysql-51-part-15\/","url_meta":{"origin":41,"position":5},"title":"Les nouveaut\u00e9s de MySQL 5.1 &#8212; (part 1\/5)","author":"Olivier DASINI","date":"28 novembre 2008","format":false,"excerpt":"Que de chemin parcouru depuis ce 5 juillet 1999, date de lancement de MySQL 3.23.0. En plus des objectifs de simplicit\u00e9 d'administration, de hautes performances et de fiabilit\u00e9, se sont greff\u00e9es, au fur et \u00e0 mesure, les fonctionnalit\u00e9s les plus demand\u00e9es par les utilisateurs. La nouvelle version du SGBDR open-source\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\/41","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=41"}],"version-history":[{"count":4,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/41\/revisions"}],"predecessor-version":[{"id":266,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/posts\/41\/revisions\/266"}],"wp:attachment":[{"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/media?parent=41"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/categories?post=41"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/dasini.net\/blog\/wp-json\/wp\/v2\/tags?post=41"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}