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?
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 ;