IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

Réalisation d'un Trigger


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    particulier
    Inscrit en
    Décembre 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : particulier

    Informations forums :
    Inscription : Décembre 2017
    Messages : 105
    Par défaut Réalisation d'un Trigger
    Bonjour

    l'application est la suivante:

    je dois mettre à jour une date de prochaine visite à partir de la date de la dernière visite en fonction d'une valeur exprimée en mois periodicite

    A l'origine ma requête manuelle était la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE `maintenance` SET `date_prochaine_visite` = DATE_ADD( `date_derniere_visite` , INTERVAL `periodicite` MONTH )
    donc j'ajoute par exemple 12 (periodicite) mois à la date_derniere_visite

    J'ai crée une nouvelle table car, sauf erreur mysql ne permet pas la mise à jour par trigger sur la même table.

    j'ai donc deux tables: la table maintenance qui contient date_derniere_visite et la table cal_revision qui contient id_maintenance pour la jointure et date_revision pour le champ que je veux mettre à jour.


    J'ai fait de multiples essais en parcourant toutes les erreurs possibles de my sql

    voici ma dernière tentative

    Si quelqu'un peut m'aider à corriger ce bout de code je l'en remercie (j'utilise l'interface de PHPMyadmin mise à jour de la table maintenance Before Update)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT `date_derniere_visite.maintenance`, date_revision.cal_revision`
     
    FROM `maintenance`,`cal_revision`
     
    UPDATE `cal_revision`
     
    SET `date_revision` = DATE_ADD( `date_derniere_visite` , INTERVAL `periodicite` MONTH )
     
    WHERE `cal_revision.id_maintenance`=`maintenance.id`

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 599
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par ODYSSEUS13 Voir le message
    J'ai crée une nouvelle table car, sauf erreur mysql ne permet pas la mise à jour par trigger sur la même table.
    Que voulez vous dire par là ? un trigger est associé à une action de mise à jour (update, delete ou insert) sur une table. Donc vous pouvez créer un trigger sur n'importe quelle table
    Par contre, ce que ne sait pas faire MySQL, c'est un trigger qui se substitue à la mise à jour par le SGBD, pas de trigger "instead of" dans MySQL

  3. #3
    Membre confirmé
    Homme Profil pro
    particulier
    Inscrit en
    Décembre 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : particulier

    Informations forums :
    Inscription : Décembre 2017
    Messages : 105
    Par défaut
    Bonjour Escartfigue et merci

    Aucun soucis, si je peux mettre à jour le champ date_prochaine_visite de ma table principale je préfèrerais mais j'ai cru comprendre que le trigger ne mettait à jour que le champ d'une autre table

  4. #4
    Membre chevronné Avatar de isabelle.letrong
    Femme Profil pro
    Conseil - Consultante en systèmes d'information
    Inscrit en
    Juillet 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultante en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2010
    Messages : 109
    Par défaut
    Bonjour ODYSSEUS13,

    Non, aucun souci pour mettre à jour la table dès que la périodicité ou la date de dernière visite sont mises à jour par exemple (on compare dans le trigger BEFORE les valeurs anciennes et nouvelles des colonnes via NEW.NomColonne et OLD.NomColonne (ne pas oublier de se poser la question des NULL...)

    ceci étant le code suivant me laisse perplexe :

    Citation Envoyé par ODYSSEUS13 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT `date_derniere_visite.maintenance`, date_revision.cal_revision`
     
    FROM `maintenance`,`cal_revision`
    Bien cordialement

  5. #5
    Membre confirmé
    Homme Profil pro
    particulier
    Inscrit en
    Décembre 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : particulier

    Informations forums :
    Inscription : Décembre 2017
    Messages : 105
    Par défaut
    Bonjour Isabelle et merci.

    Pour le code, quand on coule on complique ........

    donc, pour revenir au fondamentaux, il faut que dans mon trigger j'arrive à faire fonctionner le code suivant dans une procédure AFTER UPDATE (via phpmyadmin qui génère automatiquement une partie du code CREATE END etc..)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET `prochaine_visite` = DATE_ADD( `derniere_visite` , INTERVAL `periodicite` MONTH )
    J'ai essayé d'entrer les variables NEW et OLD sans succès, mais peut être il y a t-il une erreur de syntaxe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SET `new.prochaine_visite` = DATE_ADD( `old.derniere_visite` , INTERVAL `old.periodicite` MONTH )
    J'ai essayé d'autres variantes par exemple en mettant tout en new. ou en ne mettant que new.prochaine_visite ou en ne mettant pas old etc...


    C'est mon premier trigger et il y a quelque chose qui m'échappe.

    Merci si vous pouvez m'aider

  6. #6
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 815
    Billets dans le blog
    14
    Par défaut
    On peut avoir un exemple de requête de mise à jour et le code complet de votre trigger ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre confirmé
    Homme Profil pro
    particulier
    Inscrit en
    Décembre 2017
    Messages
    105
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : particulier

    Informations forums :
    Inscription : Décembre 2017
    Messages : 105
    Par défaut
    Bonjour Cinephil et merci de votre intervention

    Voici le code complet généré par phpmyadmin

    je ne met à jour qu'après l'instruction EACH ROW

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE DEFINER = `root`@`localhost` TRIGGER `revision update` AFTER UPDATE ON `maintenance` FOR EACH ROW  BEGIN SET `new.prochaine_visite` = DATE_ADD( `derniere_visite` , INTERVAL `periodicite` MONTH ) END;
    Je n'ai pas fait pour le moment de code pour la mise à jour dans un formulaire, je vérifie seulement le fonctionnement avec phpmyadmin en affichant la table.

    J'ai fait des variantes en ajoutant new. (ou old.) à toutes les colonnes.

    Merci à vous

  8. #8
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 815
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 815
    Billets dans le blog
    14
    Par défaut
    Déjà, je pense qu'il manque un point-virgule :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE DEFINER = `root`@`localhost` TRIGGER `revision update` AFTER UPDATE ON `maintenance` FOR EACH ROW  
    BEGIN 
    	SET `new.prochaine_visite` = DATE_ADD( `derniere_visite` , INTERVAL `periodicite` MONTH ) -- << manque ; ici
    END;
    Et la requête de mise à jour ressemble à quoi ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL-5.7] Réalisation de triggers sur MySQL
    Par Mélie98 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 26/12/2017, 16h42
  2. msi ou comment réaliser un installeur?
    Par herzleid dans le forum Delphi
    Réponses: 11
    Dernier message: 09/04/2007, 19h27
  3. [Trigger] Comment le réaliser sur une vue ?
    Par mandale dans le forum DB2
    Réponses: 1
    Dernier message: 19/09/2005, 13h43
  4. [imprecis]Réaliser a^n avec seulement l'opérateur d'addition
    Par Amon dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 08/11/2002, 22h22
  5. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 12h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo