2014-06-15 8 views
6

क्या ट्रिगर के अंदर सभी कॉलम नामों के माध्यम से लूप करना संभव है?mysql ट्रिगर में कॉलम के माध्यम से लूप

परिदृश्य: संशोधित की गई तालिका के सभी कॉलम लॉग इन करने के लिए। यदि कुछ मान नहीं बदले हैं, तो उनको लॉग न करें।

DROP TRIGGER IF EXISTS t_before_update_test; 
DELIMITER $$ 
CREATE TRIGGER t_before_update_test 
BEFORE UPDATE ON test 
FOR EACH ROW 
BEGIN 
    -- Loop here for all columns, not just col1 
    IF OLD.col1 <> NEW.col1 THEN 
     INSERT INTO change_logs(
      log_on, user_id, 
      table_name, colum_name, 
      old_data, new_data 
     ) VALUES (
      UNIX_TIMESTAMP(NOW()), '0', 
      'test', 'col1', 
      OLD.col1, NEW.col1 
     ); 
    END IF; 
    -- process looping all columns 
    -- col1, col2, ... should be dynamic per loop 
END $$ 

यह प्रतिलिपि उदाहरण काम कर रहा है, जहां मैं अब सभी स्तंभों पुरानी या नई में उपलब्ध लूप करने के लिए की जरूरत है।

उत्तर

-1

हां, कॉलम के माध्यम से एक ट्रिगर के भीतर एक कर्सर जोड़ा जा सकता है।

mysql, iterate through column names

https://dba.stackexchange.com/questions/22925/mysql-loop-over-cursor-results-ends-ahead-of-schedule

अनुभव से, यह एक संग्रहीत प्रक्रिया है कि करता है पाशन और आवेषण उन्हें आसानी से बनाया जा सकता है और यह ट्रिगर

+1

लिंक से कॉल कर सकते हैं: यहाँ लिंक के एक जोड़े हैं केवल स्टैक ओवरफ़्लो पर ही उत्तर फेंक दिए जाते हैं। यदि लिंक अमान्य हो जाते हैं तो इस पोस्ट में प्रासंगिक बिंदुओं को शामिल करना बेहतर होगा। –

+0

यह भी स्पष्ट नहीं है कि ट्रिगर के अंदर उन लिंक में समाधान का उपयोग कैसे करें (जहां आपको OLD और NEW तक पहुंचने की आवश्यकता है – adinas

संबंधित मुद्दे