2010-06-09 30 views
7

Có cách nào để thực sự lấy tên cột đã được cập nhật để sử dụng nó trong trình kích hoạt không?Nhận tên cột được cập nhật hiện tại để sử dụng trong trình kích hoạt

Về cơ bản tôi đang cố gắng để có một đường mòn kiểm toán bất cứ khi nào một chèn sử dụng hoặc cập nhật một bảng (trong trường hợp này nó đã làm với một bảng Liên hệ)

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 

Làm thế nào tôi có thể nhận được tên của cột đã được cập nhật và từ đó nhận được các giá trị OLDNEW của cột đó. Nếu nhiều cột đã được cập nhật trong một hàng hoặc thậm chí nhiều hàng thì có thể có kiểm tra cho từng cập nhật không?

Trả lời

8

Chỉ cần sử dụng OLD.colname <> NEW.colname cho mỗi cột để kiểm tra và tìm các cột khác nhau. Trình kích hoạt có một chút hạn chế trong việc sử dụng chúng trong MySQL, quá tệ.

+1

Trừ khi tôi hiểu lầm những gì bạn có nghĩa là tôi không hoàn toàn chắc chắn làm thế nào mà giúp tôi, tôi không biết trước những gì cột đang được cập nhật vì vậy tôi không thể hardcode nó trong kích hoạt. Tôi cần tìm hiểu cột nào đã được cập nhật và chèn tên của nó vào bảng kiểm toán. – Serge

+0

Vì vậy, bạn phải kiểm tra tất cả các cột. Như tôi đã nói với bạn, các trình kích hoạt khá hạn chế trong MySQL. –

+0

Tôi sợ điều đó ... Vì vậy, nếu bảng của tôi có 5 cột, tôi sẽ cần phải sử dụng nếu báo cáo cũng như một INSERT cho mỗi cột để kiểm toán mỗi cột cập nhật? – Serge

1

Hãy thử mã này ...

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 ; 
Các vấn đề liên quan