Получить текущее обновленное имя столбца для использования в триггере - PullRequest
7 голосов
/ 09 июня 2010

Есть ли способ получить имя столбца, который был обновлен, чтобы использовать его в триггере?

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

CREATE TRIGGER `after_update_contact`
    AFTER UPDATE ON `contact` FOR EACH ROW
    BEGIN
        INSERT INTO user_audit (id_user, even_date, table_name, record_id, field_name, old_value, new_value)
        VALUES (NEW.updatedby, NEW.lastUpdate, 'contact', NEW.id_contact, [...])
    END

Как получить имя обновленного столбца и из него получить значения OLD и NEW для этого столбца.Если в строке было обновлено несколько столбцов или даже несколько строк, можно ли провести аудит для каждого обновления?

Ответы [ 2 ]

8 голосов
/ 09 июня 2010

Просто используйте OLD.colname <> NEW.colname для каждого столбца, чтобы проверить и найти те, которые отличаются. Триггеры немного ограничены в использовании в MySQL, что очень плохо.

2 голосов
/ 06 марта 2014

Попробуйте этот код ...

create table sales(orderno INT, sale INT,empsalary int, ts TIMESTAMP);

create table history(updated varchar(20), oldvalue INT,newvalue INT);

INSERT INTO sales (orderno,sale,empsalary) VALUES(1,700,7000);

INSERT INTO sales (orderno,sale,empsalary) VALUES(2,800,8000);

INSERT INTO sales (orderno,sale,empsalary) VALUES(3,900,9000);

DROP TRIGGER test.instrigger;



DELIMITER ///

CREATE TRIGGER test.instrigger AFTER UPDATE ON sales
FOR EACH ROW

BEGIN

    IF NEW.sale <> OLD.sale THEN  
        INSERT INTO history (updated, oldvalue, newvalue) VALUES('sale', OLD.sale,NEW.sale);

    END IF;
    IF NEW.empsalary <> OLD.empsalary THEN  
        INSERT INTO history (updated, oldvalue, newvalue) VALUES('empsalary', OLD.empsalary,NEW.empsalary);
    END IF;
END;
///

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