J'ai une table comme ça
/*Table: pageprivilege*/
------------------------
/*Column Information*/
----------------------
FIELD TYPE COLLATION NULL KEY DEFAULT Extra PRIVILEGES COMMENT
------ ---------------- ----------------- ------ ------ ------- -------------- ------------------------------- -------
id INT(10) UNSIGNED (NULL) NO PRI (NULL) AUTO_INCREMENT SELECT,INSERT,UPDATE,REFERENCES
pageid VARCHAR(20) latin1_swedish_ci YES (NULL) SELECT,INSERT,UPDATE,REFERENCES
roleid TINYINT(4) (NULL) YES (NULL) SELECT,INSERT,UPDATE,REFERENCES
ad TINYINT(1) (NULL) YES 0 SELECT,INSERT,UPDATE,REFERENCES
ed TINYINT(1) (NULL) YES 0 SELECT,INSERT,UPDATE,REFERENCES
dl TINYINT(1) (NULL) YES 0 SELECT,INSERT,UPDATE,REFERENCES
rd TINYINT(1) (NULL) YES 0 SELECT,INSERT,UPDATE,REFERENCES
st TINYINT(1) (NULL) YES 0 SELECT,INSERT,UPDATE,REFERENCES
J'ai une condition que, si les lignes sont mises à jour telles que
ad, ed, dl, rd sont tous définis comme 0 que la valeur de ST est automatiquement modifiée à 0
Pour cela j'ai écrit une procédure
CREATE
/*[DEFINER = { user | CURRENT_USER }]*/
PROCEDURE `smsdev`.`update_priv`()
/*LANGUAGE SQL
| [NOT] DETERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT 'string'*/
BEGIN
UPDATE pageprivilege SET st=0 WHERE ad = 0 AND ed =0 AND dl =0 AND rd = 0;
END$$
DELIMITER ;
Et a ajouté un déclencheur qui est appelé après la mise à jour de la table et appelle la procédure comme celle-ci
DELIMITER $$
USE `smsdev`$$
DROP TRIGGER /*!50032 IF EXISTS */ `pageprivilege_update`$$
CREATE
/*!50017 DEFINER = 'smsdev'@'%' */
TRIGGER `pageprivilege_update` AFTER UPDATE ON `pageprivilege`
FOR EACH ROW BEGIN
CALL update_priv();
END;
$$
DELIMITER ;
Le problème est chaque fois que je fais une mise à jour de l'un des 4 champs, ad, ed, dl, rd
Je reçois cette erreur
Impossible de mettre à jour la table 'PageProtivilege' dans la fonction/déclencheur stockée car il est déjà utilisé par l'instruction qui a appelé cette fonction/déclenchement enregistrée.
Je suis nouveau pour utiliser la procédure de déclenchement et stockée, j'ai lu qui est une mauvaise idée de la procédure de déclenchement de la gâchette inside, mais c'est comme un test d'idée pour moi, donc si vous pouviez supporter avec moi et m'aider avec ce piratage -Le code, ce serait gr8.
C'est correct, vous ne pouvez pas mettre à jour la même table où la gâchette est exécutée, si vous utilisez before update
Vous pouvez définir le st
sur 0 en cochant les conditions de quelque chose comme
DELIMITER $$
USE `smsdev`$$
DROP TRIGGER /*!50032 IF EXISTS */ `pageprivilege_update`$$
CREATE
/*!50017 DEFINER = 'smsdev'@'%' */
TRIGGER `pageprivilege_update` BEFORE UPDATE ON `pageprivilege`
FOR EACH ROW
BEGIN
if (new.ad = 0 AND new.ed =0 AND new.dl =0 AND new.rd = 0) then
set new.st=0 ;
end if;
END;
$$
DELIMITER ;