2009-04-22 6 views
28

J'ai une table:En utilisant MySQL déclencheurs pour enregistrer tous les changements de table à une table secondaire

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 serais connecter pour connecter toutes les chances de FIELD1, 2 ou 3:

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 l'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 ; 

Il a donné une erreur sur la ligne d'insertion, je ne suis pas tout à fait sûr de ce que la syntaxe sur ce devrait être, ou si je vais sur ce la bonne façon. Toute aide serait appréciée. Merci.

Répondre

38

La syntaxe d'insertion est

INSERT INTO table (columns_list) VALUES (values_list) 

de sorte que 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 le répéter pour variation sur field2 et field3

Je pense que ce serait le déclencheur complet, s'il vous plaît 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 ; 
+2

Je viens d'ajouter ma pensée sur le déclencheur –

+0

Êtes-vous sûr que votre "data_table" a un champ nommé data_id? –

+1

Oups, désolé, tu as raison, quand j'ai créé mes exemples de tables, j'en ai changé une à la dernière minute. Cela a fonctionné parfaitement. Désolé pour la confusion :( – Rob

Questions connexes