MySQL Trigger - суммировать изменения в столбце в формате json - PullRequest
3 голосов
/ 23 марта 2012

Я пытаюсь создать несколько триггеров для моих таблиц MySQL, чтобы отслеживать изменения.Я думал о таблице типа

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 я не смогВыясните, возможно ли сделать что-то, что я имел в виду, и если это так, как это можно сделать.

Есть идеи или советы, как это решить?

Спасибо!

Редактировать: Опубликовано прежнее редактирование в качестве ответа.

1 Ответ

5 голосов
/ 16 апреля 2012

Хорошо, решил сам.Разве это не сложно ...;)

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 (!@first) 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 ;
...