web-dev-qa-db-fra.com

Impossible de mettre à jour le tableau après la création d'un autre déclencheur de mise à jour

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.

1
Rick Roy

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