2012-03-23 85 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