2010-06-09 15 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

जब तक मैं गलत समझा आप क्या मतलब मैं काफी यकीन है कि कैसे है कि मुझे मदद करता है नहीं कर रहा हूँ, मैं इतना मैं नहीं कर सकता अग्रिम में नहीं पता है कि क्या स्तंभ अपडेट किया जा रहा ट्रिगर में इसे हार्डकोड करें। मुझे यह पता लगाना होगा कि कौन सा कॉलम अपडेट किया गया है और ऑडिट तालिका में इसका नाम डालें। – Serge

+0

तो आपको सभी कॉलम जांचना होगा। जैसा कि मैंने आपको बताया था, ट्रिगर्स MySQL में बहुत सीमित हैं। –

+0

मुझे इससे डर था ... तो अगर मेरी तालिका में 5 कॉलम हैं तो मुझे प्रत्येक अद्यतन कॉलम का ऑडिट करने के लिए प्रत्येक के लिए कथन के साथ-साथ 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 ; 
संबंधित मुद्दे