web-dev-qa-db-fra.com

Deux instructions d'insertion à l'intérieur déclencheur - Entrée en double '521-2' pour la clé "primaire"

J'essaie de créer un déclencheur d'insertion de sorte que lorsqu'un nouvel utilisateur est inséré dans users table (via Site, httpd et PHP), une partie de ces informations est insérée dans une autre table qui gère l'accès à un wiki.

L'ID utilisateur du nouveau registre de la table utilisateur Wiki et de l'ID de groupe par défaut (2) doit également être inséré dans une autre table Wiki, de sorte qu'un nouvel utilisateur appartient à un groupe par défaut.

J'ai codé ceci:

USE users_web;

DELIMITER |
CREATE TRIGGER doku_users_ins AFTER INSERT ON users_web.users
       FOR EACH ROW
       BEGIN
                INSERT INTO users_web.doku_users (login, pass, email)
                       VALUES (NEW.user, md5(NEW.pass), NEW.email);

                INSERT INTO users_web.doku_usergroup (uid, gid)
                       SELECT du.uid, "2" FROM doku_users du
                            INNER JOIN users_web.users u ON NEW.user = du.login;

       END |

DELIMITER ;

Si la gâchette est composée uniquement de la première instruction INSERT, elle fonctionne bien, car la table DOKU_USERS est insérée d'un registre supplémentaire.

Mais lorsque je crée la gâchette comme ci-dessus, avec les deux états INSERT, je reçois une erreur comme rétroaction: Duplicate entry '521-2' for key 'PRIMARY'.

Je suppose que la deuxième instruction SQL tente de lire la valeur NEW avant d'être disponible en quelque sorte.

Comment puis-je résoudre ce problème?

3
Luis

J'ai été déconcerté par une situation similaire. Utilisez des variables pour stocker les valeurs de NEW.column et retirez la jointure de la 2e insertion:

USE users_web;

DELIMITER |
CREATE TRIGGER doku_users_ins AFTER INSERT ON users_web.users
       FOR EACH ROW
       BEGIN

                DECLARE new_pass VARCHAR(255);         -- choose the datatypes
                DECLARE new_email VARCHAR(255);        -- 
                DECLARE new_user INT;                  --

                SET new_pass = NEW.pass ; 
                SET new_email = NEW.email ;
                SET new_user = NEW.user ;

                INSERT INTO users_web.doku_users (login, pass, email)
                       VALUES (new_user, md5(new_pass), new_email);

                INSERT INTO users_web.doku_usergroup (uid, gid)
                       SELECT du.uid, '2' FROM doku_users du
                            WHERE new_user = du.login;

       END |

DELIMITER ;
5
ypercubeᵀᴹ