У меня есть таблица с именами tags
и tags_audit
.
Я создал trigger
таким образом, чтобы в случае обновления одного из полей я вставлял строки, равные количеству полей, обновленных в строке таблицы tags
, в tags_audit
Таблица.
Таблица: теги Структура:
id int(11)
name varchar(100)
slug varchar(100)
type enum('PUBLIC','PRIVATE')
filterable tinyint(1)
created_at timestamp
updated_at timestamp
tag_line varchar(500)
Таблица: теги_audit Структура:
id int(11)
tag_id int(11)
column_name varchar(50)
old_value varchar(50)
new_value varchar(50)
updated_at timestamp
Триггер
DELIMITER $$
CREATE TRIGGER after_tags_audit_update
AFTER UPDATE
ON tags FOR EACH ROW
BEGIN
DECLARE oldValue CHAR(50);
DECLARE newValue CHAR(50);
DECLARE columnName CHAR(50);
IF OLD.name <> new.name THEN
SELECT old.name, new.name INTO oldValue, newValue;
SET columnName = 'name';
INSERT INTO tags_audit(tag_id, column_name, old_value, new_value, updated_at)
VALUES(old.id, columnName, oldValue, newValue, new.updated_at);
END IF;
IF OLD.slug <> new.slug THEN
SELECT old.slug, new.slug INTO oldValue, newValue;
SET columnName = 'slug';
INSERT INTO tags_audit(tag_id, column_name, old_value, new_value, updated_at)
VALUES(old.id, columnName, oldValue, newValue, new.updated_at);
END IF;
IF OLD.type <> new.type THEN
SELECT CAST(old.type AS CHAR(10)), CAST(new.type AS CHAR(10)) INTO oldValue, newValue;
SET columnName = 'type';
INSERT INTO tags_audit(tag_id, column_name, old_value, new_value, updated_at)
VALUES(old.id, columnName, oldValue, newValue, new.updated_at);
END IF;
IF OLD.filterable <> new.filterable THEN
SELECT CAST(old.filterable AS CHAR(10)), CAST(new.filterable AS CHAR(10)) INTO oldValue, newValue;
SET columnName = 'filterable';
INSERT INTO tags_audit(tag_id, column_name, old_value, new_value, updated_at)
VALUES(old.id, columnName, oldValue, newValue, new.updated_at);
END IF;
IF OLD.tag_line <> new.tag_line THEN
SELECT old.tag_line, new.tag_line INTO oldValue, newValue;
SET columnName = 'tag_line';
INSERT INTO tags_audit(tag_id, column_name, old_value, new_value, updated_at)
VALUES(old.id, columnName, oldValue, newValue, new.updated_at);
END IF;
END$$
DELIMITER ;
Мне кажется, что вышеописанный триггер, который я написал, неуклюж, и должен быть лучший способ сделать это.
Например.
если в строке таблицы tags
обновлено 4 поля, то я делаю 4 вставки в таблицу tags_audit
. Есть ли лучший подход / способ сделать это?