PostgreSQL तालिकाओं में पंक्तियों के संस्करण के लिए Dklab_rowlog पुस्तकालय

आज के विषय की निरंतरता में संस्करण और डेटा इतिहास - मैं एक सरल उपकरण साझा करूंगा जिसका हम उपयोग करते हैं।



Dklab_rowlog कई PostgreSQL संग्रहीत प्रक्रियाओं की एक लाइब्रेरी है जो आपको डेटाबेस में किसी भी तालिका में रिकॉर्ड के संस्करण को जोड़ने की अनुमति देता है। दूसरे शब्दों में, कोई बात नहीं तालिका में क्या होता है, इससे कोई फर्क नहीं पड़ता कि डेटा वहां कैसे बदलता है (जोड़ा / हटा दिया गया है), यह एक विशेष लॉग-प्लेट में परिलक्षित होगा।



फायदे:

उपयोग के उदाहरण



मान लीजिए कि हमें इस तरह की प्लेट में बदलाव करने की आवश्यकता है:



बनाएँ TABLE test_src1 (

आईडी बिगिंट नॉट ,

एक चरित्र भिन्न ( 20 ) ,

b वर्ण भिन्न ( 20 ) ,

सी चरित्र अलग ( 20 ) ,

संशोधित_बड़ी बिंट नॉट

) ;



उदाहरण 1: हम केवल कॉलम "a" और "c" में परिवर्तन ट्रैक करते हैं। जैसे ही इन क्षेत्रों में से एक बदल गया है, इस बारे में एक रिकॉर्ड public.rowlog में जोड़ा जाएगा।



सृजित ट्राइगर t_rowlog

प्रत्येक के लिए INSERT या DELETE या UPDATE पर परीक्षण करें

सटीक प्रक्रिया रोड़ा t_rowlog_aiud ( 'diff => a' , 'diff => c' , 'rowlog => public.rowlog_ ) ;



उदाहरण 2: तालिका में एक पंक्ति को बदलते समय हमेशा पंक्तिबद्ध करने के लिए एक प्रविष्टि जोड़ें, लेकिन केवल कॉलम "a" और "b" को सहेजें। वैसे, आप पैरामीटर 'rowlog => xxx' को छोड़ सकते हैं, क्योंकि डिफ़ॉल्ट रूप से यह CURRENT_SCHEMA.rowlog के बराबर है।



सृजित ट्राइगर t_rowlog

प्रत्येक के लिए INSERT या DELETE या UPDATE पर परीक्षण करें

सटीक प्रक्रिया रोड़ा t_rowlog_aiud ( 'always => a' , 'always => b' ) ;



उदाहरण 3: प्रत्येक लॉग प्रविष्टि में हम "परिवर्तन के लेखक" की आईडी को सहेजते हैं। आप तालिका की प्राथमिक कुंजी का नाम भी स्पष्ट रूप से निर्दिष्ट कर सकते हैं (डिफ़ॉल्ट "आईडी" है)।



सृजित ट्राइगर t_rowlog

प्रत्येक के लिए INSERT या DELETE या UPDATE पर परीक्षण करें

सटीक प्रक्रिया रोड़ा t_rowlog_aiud ( 'always => a' , 'author => संशोधित_by ' , 'pk => id' ) ;



लॉग टेबल संरचना



संरचना लगभग इस प्रकार है:



बनाने योग्य पंक्तिबद्ध करें (

- पंक्ति संस्करण प्राथमिक कुंजी।

आईडी बड़ा नहीं है ,

- इस संस्करण के निर्माण का टाइमस्टैम्प।

समय क्षेत्र के साथ स्टांप टाइमस्टैम्प अब ( ) नहीं है ,

- स्रोत पंक्ति को किसने संशोधित किया? आप केवल BIGINT ही नहीं, किसी भी प्रकार को निर्दिष्ट कर सकते हैं।

लेखक बिगिन्ट ,

- परिवर्तित पंक्ति की तालिका OID।

रिलायंस एनक्लास नहीं ,

- पिछला पिछला कॉलम।

data_old hstore HULLore नहीं NULL ,

- परिणामी पंक्ति कॉलम।

data_new hstore HULLore नहीं NULL ,

- ऑपरेशन बदलें (INSERT / UPDATE / DELETE)।

ऑपरेशन enum_tg_op नहीं ,

- स्रोत तालिका की पंक्ति की प्राथमिक कुंजी।

पीके बिगिंट ,

CONSTRAINT "rowlog_pkey" प्राथमिक कुंजी ( "आईडी" )

) ;



आप अन्य फ़ील्ड्स, माउंट इंडेक्स, आदि जोड़ सकते हैं। आप एक ही लॉग टेबल में अलग-अलग तालिकाओं से रिकॉर्ड स्टोर कर सकते हैं (यह सबसे अधिक बार सुविधाजनक है, क्योंकि इस मामले में वर्जनिंग जोड़ना एक एकल निर्माता कमांड के लिए नीचे आता है)।



प्रतिबंध



उपयोग करते समय विचार करने के लिए 2 चीजें हैं:

  1. पुस्तकालय अल्ट्रा-हाई लोड के लिए डिज़ाइन नहीं किया गया है, क्योंकि अंदर कई एक्सक्लूसिव एसक्यूएल हैं। लेकिन यह आसानी से प्रति सेकंड कई हजार सम्मिलन का सामना कर सकता है।
  2. परिवर्तित डेटा को hstore में संग्रहीत करना सुविधाजनक है क्योंकि नए फ़ील्ड्स को जल्दी से स्रोत तालिका में जोड़ा जा सकता है, लेकिन एक खामी है: यदि स्रोत तालिका समय के साथ संरचनात्मक रूप से बदलती है (उदाहरण के लिए, फ़ील्ड हटा दिए जाते हैं या वहां नाम बदल दिए जाते हैं), पुराने वाले पुराने संस्करण hstore में बने रहेंगे। संरचना।

इसलिए, व्यवहार में, मैं मुख्य रूप से एक लाइव डेटाबेस या इसके प्रतिकृति (KPI) पर विभिन्न आँकड़ों की गणना के उद्देश्य से पुस्तकालय का उपयोग करने की सलाह दूंगा।



All Articles