चाड बिर्च के पास MySQL ट्रिगर और उपयोगकर्ता द्वारा परिभाषित फ़ंक्शन . आप MySQL CREATE TRIGGER Syntaxमें अधिक जानकारी प्राप्त कर सकते हैं। ए> संदर्भ।
लेकिन क्या आप सुनिश्चित हैं कि पंक्ति डालने पर आपको तुरंत निष्पादन योग्य कॉल करने की आवश्यकता है? ऐसा लगता है कि विधि विफलता के लिए प्रवण होगी, क्योंकि MySQL एक ही समय में निष्पादन योग्य के कई उदाहरण उत्पन्न कर सकता है। यदि आपका निष्पादन योग्य विफल हो जाता है, तो कोई रिकॉर्ड नहीं होगा कि कौन सी पंक्तियों को अभी तक संसाधित किया गया है और कौन सी नहीं। यदि MySQL आपके निष्पादन योग्य के समाप्त होने की प्रतीक्षा कर रहा है, तो पंक्तियाँ सम्मिलित करना बहुत धीमा हो सकता है। साथ ही, अगर चाड बिर्च सही है, तो उसे MySQL को फिर से कंपाइल करना होगा, इसलिए यह मुश्किल लगता है।
निष्पादन योग्य को सीधे MySQL से कॉल करने के बजाय, मैं केवल इस तथ्य को रिकॉर्ड करने के लिए ट्रिगर्स का उपयोग करूंगा कि एक पंक्ति INSERTED या UPDATED हो गई है:डेटाबेस में उस जानकारी को रिकॉर्ड करें, या तो अपनी मौजूदा तालिकाओं में नए कॉलम के साथ या एक नई तालिका के साथ कहें database_changes
. फिर एक बाहरी प्रोग्राम बनाएं जो नियमित रूप से डेटाबेस से जानकारी पढ़ता है, इसे संसाधित करता है, और इसे हो गया के रूप में चिह्नित करता है।
आपका विशिष्ट समाधान इस बात पर निर्भर करेगा कि बाहरी कार्यक्रम को वास्तव में किन मापदंडों की आवश्यकता है।
यदि आपके बाहरी प्रोग्राम को यह जानने की आवश्यकता है कि कौन सी पंक्ति डाली गई थी, तो आपका समाधान इस प्रकार हो सकता है:database_changes
नामक एक नई तालिका बनाएं फ़ील्ड के साथ date
, table_name
, और row_id
, और अन्य सभी तालिकाओं के लिए, इस तरह एक ट्रिगर बनाएं:
CREATE TRIGGER `my_trigger`
AFTER INSERT ON `table_name`
FOR EACH ROW BEGIN
INSERT INTO `database_changes` (`date`, `table_name`, `row_id`)
VALUES (NOW(), "table_name", NEW.id)
END;
तब आपकी बैच स्क्रिप्ट कुछ इस तरह कर सकती है:
- डेटाबेस_परिवर्तन तालिका में पहली पंक्ति का चयन करें।
- इसे संसाधित करें।
- इसे हटाएं।
- 1-3 को
database_changes
. तक दोहराएं खाली है।
इस दृष्टिकोण के साथ, आप इस पर अधिक नियंत्रण कर सकते हैं कि डेटा कब और कैसे संसाधित होता है, और आप यह देखने के लिए आसानी से जांच सकते हैं कि क्या डेटा वास्तव में संसाधित हुआ है (बस यह देखने के लिए जांचें कि क्या database_changes
टेबल खाली है)।