2010-06-09 2 views
7

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

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

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 этого столбца. Если несколько столбцов были обновлены в строке или даже нескольких рядах, можно ли провести аудит для каждого обновления?

ответ

8

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

+1

Если я не понял, что ты имел в виду, я не совсем уверен, как это помогает мне, я не знаю заранее, что столбец обновляется, так что я не могу hardcode это в триггере. Мне нужно выяснить, какой столбец был обновлен, и вставить его имя в таблицу аудита. – Serge

+0

Итак, вы должны проверить все столбцы. Как я уже говорил, триггеры довольно ограничены в MySQL. –

+0

Я боялся этого ... Итак, если моя таблица имеет 5 столбцов, мне нужно будет использовать операторы if, а также INSERT для каждого, чтобы проверять каждый обновленный столбец? – Serge

1

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

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 ; 
Смежные вопросы