Postgres में "ट्रांज़िशन टेबल" क्या है?


12

पृष्ठ जो बताता है कि नया क्या है, पोस्टग्रेज 10 में "ट्रिगर्स के लिए संक्रमण सारणी" का उल्लेख है।

ट्रिगर्स के लिए संक्रमण सारणी

यह सुविधा AFTER STATEMENT, उपयुक्त और पुरानी दोनों पंक्तियों को प्रश्‍नों में उजागर करके उपयोगी और प्रदर्शनकारी दोनों को ट्रिगर बनाती है। इस सुविधा से पहले, AFTER STATEMENTट्रिगर्स के पास इन तक कोई सीधी पहुँच नहीं थी, और वर्कअराज़ बायज़ेंटाइन थे और उनका प्रदर्शन खराब था। बहुत ट्रिगर तर्क को अब AFTER STATEMENTप्रत्येक पंक्ति में महंगे संदर्भ स्विच करने की आवश्यकता से बचने के रूप में लिखा जा सकता है , जिसके लिए EACH ROW ट्रिगर की आवश्यकता होती है।

एक संक्रमण तालिका क्या है?

जवाबों:


12

तुम्हें पता है कि कैसे देखते हैं OLDऔर NEWके लिए रिकार्ड चर FOR EACH ROWचलाता?

संक्रमण सारणी FOR EACH STATEMENTसमतुल्य हैं। वे पुराने और नए tuples के साथ टेबल हैं, इसलिए आपके ट्रिगर देख सकते हैं कि क्या बदल गया है।


9

मुझे वास्तव में क्रेग की विशेषता की व्याख्या पसंद है। SQL-2011 स्पेक उन्हें एक ट्रिगर के संदर्भ में परिभाषित करता है "पंक्तियों का एक संग्रह नष्ट, डाला या प्रतिस्थापित किया जा रहा है, जिसे एक संक्रमणकालीन स्टीम टेबल कहा जाता है।" डॉक्स में एक समान व्याख्या प्रदान की जाती है,

जबकि AFTERट्रिगर के लिए संक्रमण तालिका REFERENCINGमानक तरीके से क्लॉज का उपयोग करके निर्दिष्ट की जाती है , ट्रिगर में उपयोग किए जाने वाले पंक्ति चर FOR EACH ROWको REFERENCINGक्लॉज में निर्दिष्ट नहीं किया जा सकता है । वे एक तरीके से उपलब्ध हैं जो उस भाषा पर निर्भर है जिसमें ट्रिगर फ़ंक्शन लिखा गया है। कुछ भाषाएं प्रभावी रूप से व्यवहार करती हैं जैसे कि कोई REFERENCINGखंड हैOLD ROW AS OLD NEW ROW AS NEW.

अनिवार्य रूप से वे पूरे विवरण के परिवर्तन को आपके लिए उपलब्ध कराते हैं, जो सुपर आसान है। संदर्भ के लिए, बनाएँ ट्रिगर पर DDL संक्रमण तालिका के साथ इस तरह दिखता है

REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable

आप यहां एक उदाहरण देख सकते हैं , और यहां टेस्ट सूट से एक है ,

CREATE TABLE transition_table_base (id int PRIMARY KEY, val text);

CREATE FUNCTION transition_table_base_ins_func()
  RETURNS trigger
  LANGUAGE plpgsql
AS $$
DECLARE
  t text;
  l text;
BEGIN
  t = '';
  FOR l IN EXECUTE
           $q$
             EXPLAIN (TIMING off, COSTS off, VERBOSE on)
             SELECT * FROM newtable
           $q$ LOOP
    t = t || l || E'\n';
  END LOOP;

  RAISE INFO '%', t;
  RETURN new;
END;
$$;

CREATE TRIGGER transition_table_base_ins_trig
  AFTER INSERT ON transition_table_base
  REFERENCING OLD TABLE AS oldtable NEW TABLE AS newtable
  FOR EACH STATEMENT
  EXECUTE PROCEDURE transition_table_base_ins_func();

कुछ अतिरिक्त नोट

  1. वे केवल AFTERट्रिगर पर उपलब्ध हैं ।
  2. वे जैसी चीजों को ध्यान में रखते हैं ON CONFLICT

यह इंगित करना महत्वपूर्ण है कि पीजी 10 में उपलब्ध होना पूरी तरह से निश्चित नहीं हैसंक्रमण तालिकाओं के साथ बहुत सारे खुले मुद्दे हैं । अधिकांश में पैच हैं। कुछ अनहोनी होती है जो दिनचर्या की तरह है। ऐसा लगता है कि भारी उठाने को किसी और ने उठाया था। धागा इंगित करता है कि हम जल्द ही पता चल जाएगा।

लेखक ने जवाब दिया - लगता है फिर से अच्छा हो जाएगा,।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.