MySQL триггер после обновления для вставки в таблицу аудита - PullRequest
0 голосов
/ 01 апреля 2020

У меня есть таблица с именами 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. Есть ли лучший подход / способ сделать это?

...