Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/12/2006, 15h12   #1
Membre du Club
 
Homme Stéphane
Développeur Web
Inscription : septembre 2005
Messages : 100
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 37
Localisation : France, Ille et Vilaine (Bretagne)

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

Informations forums :
Inscription : septembre 2005
Messages : 100
Points : 45
Points : 45
Envoyer un message via MSN à Shiva
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 :
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;
Shiva est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2007, 00h31   #2
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
la pseudo-table new te permet de faire ça + simplement et + efficacement :

Code :
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 SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2007, 03h44   #3
Membre du Club
 
Homme Stéphane
Développeur Web
Inscription : septembre 2005
Messages : 100
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 37
Localisation : France, Ille et Vilaine (Bretagne)

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

Informations forums :
Inscription : septembre 2005
Messages : 100
Points : 45
Points : 45
Envoyer un message via MSN à Shiva
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.
Shiva est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2007, 08h07   #4
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
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 ?
Citation:
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 SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2007, 14h32   #5
Membre du Club
 
Homme Stéphane
Développeur Web
Inscription : septembre 2005
Messages : 100
Détails du profil
Informations personnelles :
Nom : Homme Stéphane
Âge : 37
Localisation : France, Ille et Vilaine (Bretagne)

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

Informations forums :
Inscription : septembre 2005
Messages : 100
Points : 45
Points : 45
Envoyer un message via MSN à Shiva
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
Shiva est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h29.


 
 
 
 
Partenaires

Hébergement Web