web-dev-qa-db-fra.com

Comment créer un déclencheur pour mettre à jour l'horodatage lorsque l'enregistrement est mis à jour ou inséré dans une autre table

J'ai une table T_TASK et une table T_Taskaction avec une clé étrangère à T_TASK. Je voudrais mettre à jour l'horodatage de T_TASK qui fait référence au formulaire de clé étrangère T_Taskaction avec chaque mise à jour en action.

Il n'obtient aucun udpate dans la table T_TASK, et je ne reçois aucune erreur.

USE `myTask`;
DELIMITER $$
CREATE TRIGGER `t_taskaction_AUPD` AFTER UPDATE ON `t_taskaction` FOR EACH ROW
BEGIN
    DECLARE idTask INT(11);
    DECLARE idTaskState INT(11);

    set @idTask = NEW.idTask;

    set @idTask = (SELECT idTaskState 
    FROM t_task WHERE idTask = @idTask);

    UPDATE t_task 
    SET idTaskState = @idTaskState
    WHERE idTask = @idTask;
END$$
DELIMITER ;

Tables

CREATE TABLE IF NOT EXISTS `myTask`.`t_task` (
  `idTask` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `task` VARCHAR(100) NOT NULL,
  `idTaskState' INT(11) UNSIGNED NOT NULL DEFAULT 1,
  `description` LONGTEXT NOT NULL,
  `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`idTask`)
)

CREATE TABLE IF NOT EXISTS `myTask`.`t_taskAction` (
  `idTaskAction` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `idTask` INT(11) NOT NULL,
  `fecha` DATETIME NOT NULL,
  `action` VARCHAR(45) NOT NULL,
  `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`idTaskAction`, `idTask`),
  CONSTRAINT `t_ifocTareaAccion2t_ifocTarea`
    FOREIGN KEY (`idTaskAction`)
    REFERENCES `myTask`.`t_task` (`idTask`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)

CREATE TABLE IF NOT EXISTS `myTask`.`a_taskState` (
  `idTaskState` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
  `order` INT(11) NULL DEFAULT NULL,
  `state` VARCHAR(45) NOT NULL,
  `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`idTaskState`))
2
Joe

Merci Michael pour votre aide!

Bon à savoir que @variables sont des variables d'utilisateurs et sans @ sont des variables locales.

Les souris suivants ont bien fonctionné

USE `myTask`;
DELIMITER $$
CREATE DEFINER=`root`@`localhost` TRIGGER `t_taskaction_AUPD` 
AFTER UPDATE ON `t_taskaction` 
FOR EACH ROW
BEGIN
    DECLARE _idTask INT(11);
    DECLARE _idTaskState INT(11);

    set _idTask = NEW.idTask;

    set _idTask = (SELECT idTaskState 
    FROM t_task WHERE idTask = _idTask);

    UPDATE t_task 
    SET timestamp = now()
    WHERE idTask = _idTask;
END$$
DELIMITER ;
3
Joe