web-dev-qa-db-fra.com

Utilisation des déclencheurs MySQL pour enregistrer toutes les modifications de table dans une table secondaire

J'ai une table:

CREATE TABLE `data_table` (
`data_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`field1` INT NOT NULL ,
`field2` INT NOT NULL ,
`field3` INT NOT NULL
) ENGINE = MYISAM ;

Je voudrais me connecter pour enregistrer toutes les chances de champ1, 2 ou 3 pour:

CREATE TABLE `data_tracking` (
`tracking_id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`data_id` INT NOT NULL ,
`field` VARCHAR( 50 ) NOT NULL ,
`old_value` INT NOT NULL ,
`new_value` INT NOT NULL ,
`modified` DATETIME NOT NULL
) ENGINE = MYISAM ; 

J'utilise MySQL 5, et je voudrais créer un déclencheur à faire. Je voudrais insérer une nouvelle ligne dans data_tracking chaque fois que data_table est mis à jour et enregistrer la valeur ancienne/mise à jour, ainsi que le champ modifié. J'ai essayé ce qui suit sans succès.

DELIMITER $$

DROP TRIGGER `update_data `$$

CREATE TRIGGER `update_data` AFTER UPDATE on `data_table`
FOR EACH ROW
BEGIN
    IF (NEW.field1 != OLD.field1) THEN
        INSERT INTO data_tracking set old_value = OLD.field1, new_value = NEW.field1, field = "field1";
    END IF;
END$$

DELIMITER ;

Cela a donné une erreur sur la ligne d'insertion, je ne sais pas trop quelle devrait être la syntaxe, ou si je vais dans le bon sens. Toute aide serait appréciée. Merci.

32
Rob

La syntaxe d'insertion est

INSERT INTO table (columns_list) VALUES (values_list)

donc votre insert ressemblerait à quelque chose comme ça (je ne suis pas un expert MySQL mais vous pouvez adapter la requête):

INSERT INTO data_tracking 
(`data_id` , `field` , `old_value` , `new_value` , `modified` ) 
VALUES 
(NEW.data_id, 'field1', OLD.field, NEW.field, CURRENT_DATETIME());

Et répétez-le pour varier les champs 2 et 3

Je pense que ce serait le déclencheur complet, veuillez essayer:

DELIMITER $$

DROP TRIGGER `update_data `$$

CREATE TRIGGER `update_data` AFTER UPDATE on `data_table`
FOR EACH ROW
BEGIN
    IF (NEW.field1 != OLD.field1) THEN
        INSERT INTO data_tracking 
            (`data_id` , `field` , `old_value` , `new_value` , `modified` ) 
        VALUES 
            (NEW.data_id, "field1", OLD.field1, NEW.field1, NOW());
    END IF;
    IF (NEW.field2 != OLD.field2) THEN
        INSERT INTO data_tracking 
            (`data_id` , `field` , `old_value` , `new_value` , `modified` ) 
        VALUES 
            (NEW.data_id, "field2", OLD.field2, NEW.field2, NOW());
    END IF;
    IF (NEW.field3 != OLD.field3) THEN
        INSERT INTO data_tracking 
            (`data_id` , `field` , `old_value` , `new_value` , `modified` ) 
        VALUES 
            (NEW.data_id, "field3", OLD.field3, NEW.field3, NOW());
    END IF;
END$$

DELIMITER ;