2012-03-23 93 views
4

我试图为我的MySQL表创建一些触发器来跟踪更改。我想到了一个表像MySQL触发器 - 总结json格式化列中的更改

CREATE TABLE IF NOT EXISTS `contacts_changes` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `action` enum('insert','update','delete') NOT NULL, 
    `contact_id` int(6) NOT NULL, 
    `changes` text NOT NULL, 
    PRIMARY KEY (`id`) 
); 

其中CONTACT_ID是一个外键,我想监视和列的变化我想存储使用JSON格式所做的更改表。

因此,如果我更改联系人表中条目的姓氏和生日,更改列应包含{"familyname": "Smith", "birthday": "1982-06-24}

我发现了很多使用触发器跟踪更改的示例,但没有一个总结了单行单列中所做的更改。他们所做的是为每个更改插入一个新行,即一行更改生日,另一行更改姓氏。由于我对(My)SQL语言知识的缺乏,我未能弄清楚是否有可能做一些我脑海中想做的事情,以及它是如何完成的。

任何想法或提示如何解决这个问题?

谢谢!

编辑:发表以前的编辑为答案。

回答

6

好吧,自己解决吧。是不是很难...;)

DELIMITER ;; 
CREATE TRIGGER `contacts_bu` BEFORE UPDATE ON `contacts` FOR EACH ROW 
BEGIN 
SET @json = "{"; 
SET @first = true; 
IF (OLD.name!=NEW.name) THEN 
    SET @first = false; 
    SET @json = CONCAT(@json, "\"name\"", ":", "\"", NEW.name, "\""); 
END IF; 
IF (OLD.birthdate!=NEW.birthdate) THEN 
    IF ([email protected]) THEN 
     SET @json = CONCAT(@json, ","); 
    END IF; 
    SET @first = false; 
    SET @json = CONCAT(@json, "\"birthdate\"", ":", "\"", NEW.birthdate, "\""); 
END IF; 

SET @json = CONCAT(@json, "}"); 

INSERT INTO contacts_changes (`action`, `contact_id`, `changes`) 
VALUES ('update', NEW.id, @json); 

END;; 
DELIMITER ; 
+2

例如,你处理的情况下,当OLD.name或NEW.name为空。 @json的插入值为NULL。 – TechCare99 2016-09-21 16:09:51

+0

如果New.name具有双引号字符会怎样? – Jaguar 2018-02-06 12:12:59