पोस्टग्रेज टेबल में प्रत्येक रिकॉर्ड के लिए ट्रिगर चलाने का एक अच्छा तरीका है?


22

मेरे पास एक ऐसी प्रणाली है जहाँ मैं कुछ तालिकाओं के डिज़ाइन को नियंत्रित नहीं कर सकता (Slony-I के माध्यम से दोहराया गया है), और इसलिए मेरे पास एक श्रृंखला है जिसे हम 'शैडो टेबल' के रूप में संदर्भित करते हैं, जहाँ मैं प्रतिकृति तालिकाओं में से कुछ जानकारी निकालता हूँ , और इसे उन संसाधित रूप में संग्रहीत करें, जिनकी मुझे आवश्यकता है, जबकि उन रिकॉर्ड्स को अलग करना है जिन्हें मैं अनदेखा करना चाहता हूं।

अभी, एक नई प्रतिकृति स्थापित करने के बाद, मैं एक अपडेट चलाता हूं और UPDATE tablename SET field=fieldट्रिगर करने के लिए बाध्य करने के लिए स्वयं (जैसे ) पर मान वापस सेट करता हूं , लेकिन कुछ तालिकाओं के लाखों रिकॉर्ड हैं, और बढ़ते हैं, और इसमें 30min लग सकते हैं । (और फिर वेक्युम भी है)।

क्या इसे ट्रिगर करने का कोई बेहतर तरीका है, या किसी फ़ंक्शन को लिखने का कोई तरीका है कि यह या तो इनपुट के साथ काम करेगा या NEWकॉलिंग संदर्भ पर निर्भर करेगा? मैं दो अलग-अलग कार्यों को रखने के लिए अनिच्छुक हूं, क्योंकि मैंने बहुत बार देखा है जहां एक अपडेट किया जाता है, और दूसरा नहीं।


मुझे पता था कि ट्रिगर कैसे चलाना है ... मैंने पूछा कि क्या कोई अच्छा तरीका है।
जो

जवाबों:


19

यह निम्नलिखित टेम्पलेट का उपयोग करके किया जा सकता है:

CREATE TABLE tablename ( ... );

/* for direct invocation */
CREATE FUNCTION propagate_data(newrow tablename) RETURNS void
LANGUAGE plpgsql
AS $$
BEGIN
    INSERT INTO other_table VALUES (newrow.a, newrow.b, ...);
END:
$$;

/* trigger function wrapper */
CREATE FUNCTION propagate_data_trg() RETURNS trigger
LANGUAGE plpgsql
AS $$
BEGIN
    PERFORM propagate_data(NEW);
END;
$$;

CREATE TRIGGER propagate_data AFTER INSERT ON tablename FOR EACH ROW
    EXECUTE PROCEDURE propagate_data_trg();

दोहे ... मैं इसके बारे में पीछे की ओर सोच रहा था (एक प्रक्रिया द्वारा ट्रिगर फ़ंक्शन को कॉल करने की कोशिश कर रहा था, न कि वीज़ा-वर्सा)।
जो

1
जब मैंने वास्तव में ऐसा किया, तो मुझे एहसास हुआ कि 'पंक्ति' एक आरक्षित शब्द था, इसलिए मैंने उदाहरण को सही किया ताकि अन्य लोग लंबी डिबगिंग के रूप में खर्च न करें।
जो

1
मुझे वास्तव में वर्षों पहले पालन करना चाहिए था। इससे पहले कि मुझे अपने सिस्टम में काम करने में सबकुछ हासिल करने में कुछ समय लगे, मुझे यह समझ में आ गया ... और यह तरीका काम करता है, लेकिन प्रदर्शन भगवान का था। (इसे पूरा होने में एक दिन से अधिक 30 मिनट तक चला गया)।
जो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.