MySql ПОСЛЕ ОБНОВЛЕНИЯ триггер с именами полей - PullRequest
6 голосов
/ 13 декабря 2011

У меня есть две таблицы, перечисленные ниже.Когда поле «переключатели» обновляется, мне нужно вставить запись в «switch_updates», которая включает имя обновленного поля, старое значение и новое значение.

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

---------------------
|  switches         |
---------------------
|  id               |
|  name (varchar)   |
|  functional (int) |
---------------------


-----------------------------
|  switch_updates           |
-----------------------------
|  id                       |
|  field_name (varchar)     |
|  field_original (varchar) |
|  field_new (varchar)      |
-----------------------------

Триггер

CREATE TRIGGER SwitchUpdate_Trigger
AFTER UPDATE ON switches
FOR EACH ROW
BEGIN
    INSERT into switch_updates (id, switch_id, field_name, field_original, field_new)
    VALUES 
        (
            null,
            NEW.id, -- switch_id
                  , -- field_name?
            OLD.field_value, --?
            NEW.field_value, --?
        );
END;

Ответы [ 3 ]

4 голосов
/ 13 декабря 2011

Вы не можете непосредственно найти имя поля, которое обновляется.

То, что вы можете получить, это значение, которое имела строка (поля), и значение, которое будет иметь строка (поля) (OLD иNEW).
Вы можете сравнить старое и новое значение для всех полей (вручную), и, если оно изменилось, вы должны вставить это в свою таблицу.

Возможные проблемы:

  • Вы не можете узнать, не было ли поле в запросе или было «обновлено» с тем же значением.В обоих случаях значение OLD en NEW будет одинаковым
  • Это довольно трудоемко

Но в итоге вы можете получить то, что хотите, вот так?

3 голосов
/ 13 декабря 2011

Из создать документацию триггера :

Вы можете ссылаться на столбцы в предметной таблице (таблица, связанная с триггером), используя псевдонимы OLD и NEW. OLD.col_name ссылается на столбец существующей строки до того, как будет обновлен или удален. NEW.col_name ссылается на столбец новой строки для вставки или существующей строки после она обновляется.

Из интересного блога :

В триггере INSERT можно использовать только NEW.col_name, поскольку старой строки нет. В триггере DELETE может использоваться только OLD.col_name, поскольку новой строки нет. В триггере UPDATE вы можете использовать OLD.col_name для ссылки на столбцы строки до их обновления и NEW.col_name для ссылки на столбцы строки после их обновления.

Это означает, что вы должны быть в состоянии выполнить свою задачу.

2 голосов
/ 01 октября 2013

На самом деле я работаю над такой же задачей, и, насколько я обнаружил, единственный способ получить имена обновленных полей - это проверить каждое из них вручную, как сказал @Nanne.

Базовый пример:

IF OLD.name <> NEW.name THEN
    INSERT INTO audit_table (`field`, `old_value`, `new_value`)
    VALUES ('name', OLD.name, NEW.name);
END IF;

Повторите для любого количества столбцов, которые вы хотите отслеживать.Если кто-то знает лучший способ, я бы с удовольствием это услышал!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...