Как проверить разницу в каждом столбце OLD.* NEW.* В MySQL Trigger?

Поскольку SQL не имеет FOR-EACH утверждение, как мы можем проверить, есть ли разница по каждому значению из OLD возражать против NEW объект в AFTER UPDATE тип TRIGGER не зная столбцов таблицы [и имен таблиц]?

Пример сегодня:

CREATE TRIGGER `audit_events_ugly`
AFTER UPDATE ON `accounts`
FOR EACH ROW
BEGIN
       DECLARE changes VARCHAR(8000);
       IF OLD.user_name <> NEW.user_name THEN
            SET changes = 'user_name from % to %';
       END IF;
       IF OLD.user_type <> NEW.user_type THEN
            SET changes = CONCAT(changes, ', user_type from % to %');
       END IF;
       IF OLD.user_email <> NEW.user_email THEN
            SET changes = CONCAT(changes, ', user_email from % to %');
       END IF;
       CALL reg_event(how_canI_get_tableName?, @user_id, changes);
       -- and that can go on and on... differently for every table.
END;

Пример, как я хотел бы быть:

CREATE TRIGGER `audit_events_nice`
AFTER UPDATE ON `accounts`
FOR EACH ROW
BEGIN
       DECLARE changes VARCHAR(8000);
       DECLARE N INT DEFAULT 1;
       FOREACH OLD, NEW as OldValue, NewValue 
       BEGIN
              IF OldValue <> NewValue THEN
              SET changes = CONCAT(changes, ', column N: % to %');
              SET N = N + 1;
       END IF;
       CALL reg_event(how_canI_get_tableName?, @user_id, changes);
       -- now I can paste this code in every table that is audited..
END;

Есть идеи? КОГДА, ИССЛЕДОВАНИЕ, МАРШРУТЫ...

1 ответ

Решение

Я думаю, что вы не можете сделать это непосредственно в цикле for на уровне триггера.

Однако вы можете использовать скрипт для генерации кода триггера. Вам нужно будет заново генерировать его каждый раз, когда вы добавляете / удаляете поле в таблицу (обычно не часто).

Другие вопросы по тегам