2010-06-09 7 views
7

Gibt es eine Möglichkeit, den aktualisierten Spaltennamen zu erhalten, um ihn in einem Trigger zu verwenden?Aktuellen Spaltennamen zur Verwendung in einem Trigger abrufen

Grundsätzlich versuche ich, eine Audit-Trail zu haben, wenn ein Benutzer Einsatz oder eine Tabelle aktualisiert (in diesem Fall mit einer Contact-Tabelle zu tun hat)

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 

Wie kann ich den Namen der bekommen Spalte, die aktualisiert wurde und von dieser erhalten die OLD und NEW Werte dieser Spalte. Wenn mehrere Spalten in einer Zeile oder sogar in mehreren Zeilen aktualisiert wurden, ist es möglich, für jedes Update ein Audit durchzuführen?

Antwort

8

Verwenden Sie einfach OLD.colname <> NEW.colname für jede Spalte, um zu überprüfen und zu finden, die sich unterscheiden. Trigger sind in ihrer Verwendung in MySQL ein wenig eingeschränkt, schade.

+1

Wenn ich nicht falsch verstanden, was Sie bedeuten, dass ich bin mir nicht ganz sicher, wie das hilft mir, ich weiß nicht im Voraus, was Spalte so kann ich aktualisiert wird nicht hardcode es im Trigger. Ich muss herausfinden, welche Spalte aktualisiert wurde und seinen Namen in die Audit-Tabelle einfügen. – Serge

+0

Sie müssen also alle Spalten überprüfen. Wie ich bereits sagte, Trigger sind in MySQL ziemlich begrenzt. –

+0

Ich hatte Angst davor ... Also, wenn meine Tabelle 5 Spalten hat, muss ich if-Anweisungen sowie ein INSERT für jeden verwenden, um jede aktualisierte Spalte zu überprüfen? – Serge

1

diesen Code Versuchen ...

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 ;