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 :

Trigger d'insertion et d'update


Sujet :

SQL Procédural MySQL

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services à domicile

    Informations forums :
    Inscription : Septembre 2005
    Messages : 197
    Points : 121
    Points
    121
    Par défaut Trigger d'insertion et d'update
    Bonjour,

    J'utilise pour la première fois les triggers etca ne tourne pas complètement comme je le voudrais.
    Ce que je souhaite faire :
    Dans la base test j'ai la table amis contenant les champs id, nom, prenom, status
    Dans la base test2 j'ai aussi une table amis contenant les champs nom, prenom
    j'ai besoin que quand une insertion à lieu dans la table test.amis elle soit aussitôt insérée dans
    la table test2.amis.

    Pour ne prendre que les dernières lignes je selectionne que celles dont status = 0
    Insertion dans la table test2.amis
    Update de status à 1 dans test.amis

    Seul fonctionne l'insertion dans test2.amis mais pas l'update et l'erreur suivante survient :
    ERROR 1442 (HY000): Can't update table 'amis' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

    Voici le trigger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    CREATE TRIGGER ajout_amis AFTER INSERT ON test.amis FOR EACH ROW
    BEGIN
        DECLARE v_id INT;
        DECLARE v_nom VARCHAR(20);
        DECLARE v_prenom VARCHAR(20);
        DECLARE v_status CHAR(1);
        DECLARE curseur CURSOR FOR SELECT id, nom, prenom, status FROM test.amis WHERE status = '0';
        DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_status = 1;
     
        OPEN curseur;
     
        boucle_amis: LOOP
            FETCH curseur INTO v_id, v_nom, v_prenom, v_status;
            IF (v_status = 1) THEN LEAVE boucle_amis;
            END IF;
     
            UPDATE test.amis SET status = '1' WHERE id = v_id;
            INSERT INTO test2.amis (id, nom, prenom) VALUES (v_id, v_nom, v_prenom);
        END LOOP;
    END;

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    la pseudo-table new te permet de faire ça + simplement et + efficacement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    FOR EACH ROW
    INSERT INTO test2.amis (nom, prenom)
    VALUES (new.nom, new.prenom) ;
    il existe de même old dans Update et Delete
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services à domicile

    Informations forums :
    Inscription : Septembre 2005
    Messages : 197
    Points : 121
    Points
    121
    Par défaut
    Ok pour la pseudo table new mais dans ce cas comment je les insères dans ma table amis de la base test2 ?
    Car là l'insert se passe bien mais pas le update.

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par Shiva
    Ok pour la pseudo table new mais dans ce cas comment je les insères dans ma table amis de la base test2 ?
    c'est pas ce qu'on vient de faire ?
    Car là l'insert se passe bien mais pas le update.
    il te faut un repère : soit l'ID de test2.amis n'est un autoincrement mais une copie de celle de test.amis, soit tu crées une clé unique sur la combinaison nom/prénom.
    Ensuite, tu crées un trigger AFTER UPDATE qui effectue un REPLACE INTO test2.amis identique à l'INSERT ci-dessus.

    Tu pourras ensuite prévoir un trigger sur le DELETE, utilisant lui aussi soit old.ID, soit old.nom et old.prenom.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2005
    Messages
    197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Services à domicile

    Informations forums :
    Inscription : Septembre 2005
    Messages : 197
    Points : 121
    Points
    121
    Par défaut
    Bon, ce matin j'étais ailleurs, car ta solution de pseudo-table new fonctionne à merveille, je regarde maintenant pour l'update et le delete.

    Merci à toi et bonne année

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

Discussions similaires

  1. Trigger simple INSERT/UPDATE
    Par castorcharly dans le forum Développement
    Réponses: 6
    Dernier message: 12/11/2010, 14h54
  2. création d'un seul trigger for insert, delete, update
    Par gilardino dans le forum Développement
    Réponses: 2
    Dernier message: 23/04/2009, 01h41
  3. Trigger Oracle remplacant un INSERT par un UPDATE
    Par sat83 dans le forum PL/SQL
    Réponses: 18
    Dernier message: 30/01/2009, 13h48
  4. Trigger Before Insert et Before Update
    Par NicoNours dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 14/08/2007, 10h20
  5. TRIGGER avec inserted + UPDATE sur INSERTED
    Par shaka84 dans le forum Développement
    Réponses: 3
    Dernier message: 12/04/2006, 10h26

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