2010-06-09 3 views
7

C'è un modo per ottenere effettivamente il nome della colonna che è stato aggiornato per poterlo utilizzare in un trigger?Ottieni il nome della colonna aggiornato corrente da utilizzare in un trigger

Fondamentalmente sto cercando di avere una traccia di verifica ogni volta che un utente inserisce o aggiorna una tabella (in questo caso si ha a che fare con un tavolo di contatto)

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 

Come posso ottenere il nome del colonna che è stata aggiornata e da quella ottengono i valori OLD e NEW di quella colonna. Se più colonne sono state aggiornate in una riga o anche in più righe, è possibile avere una verifica per ogni aggiornamento?

risposta

8

Basta usare OLD.colname <> NEW.colname per ogni colonna per controllare e trovare quelli che sono diversi. I trigger sono un po 'limitati nel loro uso in MySQL, peccato.

+1

A meno che non ho capito male quello che volevi dire io non sono del tutto sicuro di come questo mi aiuta, non so in anticipo che cosa colonna che viene aggiornato in modo non posso hardcode nel trigger. Devo scoprire quale colonna è stata aggiornata e inserire il suo nome nella tabella di controllo. – Serge

+0

Quindi devi controllare tutte le colonne. Come ti ho detto, i trigger sono piuttosto limitati in MySQL. –

+0

Avevo paura di questo ... Quindi se la mia tabella ha 5 colonne dovrò usare se le istruzioni e un INSERT per ciascuna per controllare ogni colonna aggiornata? – Serge

1

Prova questo codice ...

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 ;