PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

मुझे पिछली बार कैसे पता चलेगा कि PostgreSQL डेटाबेस को अपडेट किया गया है?

आप एक ट्रिगर लिख सकते हैं हर बार किसी विशेष टेबल पर डालने/अद्यतन किए जाने पर चलाने के लिए। सामान्य उपयोग पंक्ति के "बनाए गए" या "last_updated" कॉलम को वर्तमान समय पर सेट करना है, लेकिन यदि आप मौजूदा तालिकाओं को बदलना नहीं चाहते हैं तो आप केंद्रीय स्थान में भी समय अपडेट कर सकते हैं।

तो उदाहरण के लिए एक विशिष्ट तरीका निम्नलिखित है:

CREATE FUNCTION stamp_updated() RETURNS TRIGGER LANGUAGE 'plpgsql' AS $$
BEGIN
  NEW.last_updated := now();
  RETURN NEW;
END
$$;
-- repeat for each table you need to track:
ALTER TABLE sometable ADD COLUMN last_updated TIMESTAMP;
CREATE TRIGGER sometable_stamp_updated
  BEFORE INSERT OR UPDATE ON sometable
  FOR EACH ROW EXECUTE PROCEDURE stamp_updated();

फिर अंतिम अपडेट समय खोजने के लिए, आपको प्रत्येक तालिका से "MAX(last_updated)" का चयन करना होगा और उनमें से सबसे बड़ा लेना होगा, जैसे:

SELECT MAX(max_last_updated) FROM (
  SELECT MAX(last_updated) AS max_last_updated FROM sometable
  UNION ALL
  SELECT MAX(last_updated) FROM someothertable
) updates

सीरियल (या समान रूप से जेनरेट की गई) प्राथमिक कुंजी वाली तालिकाओं के लिए, आप प्राथमिक कुंजी इंडेक्स का उपयोग करके नवीनतम अपडेट समय खोजने के लिए अनुक्रमिक स्कैन से बचने का प्रयास कर सकते हैं, या आप last_updated पर इंडेक्स बनाते हैं।

-- get timestamp of row with highest id
SELECT last_updated FROM sometable ORDER BY sometable_id DESC LIMIT 1

ध्यान दें कि आईडी काफी अनुक्रमिक नहीं होने की स्थिति में यह थोड़ा गलत परिणाम दे सकता है, लेकिन आपको कितनी सटीकता की आवश्यकता है? (ध्यान रखें कि लेन-देन का मतलब है कि पंक्तियाँ आपको उनके बनाए जाने के क्रम में अलग-अलग क्रम में दिखाई दे सकती हैं।)

प्रत्येक तालिका में 'अपडेटेड' कॉलम जोड़ने से बचने का एक वैकल्पिक तरीका यह है कि अपडेट टाइमस्टैम्प को स्टोर करने के लिए एक केंद्रीय तालिका हो। उदाहरण के लिए:

CREATE TABLE update_log(table_name text PRIMARY KEY, updated timestamp NOT NULL DEFAULT now());
CREATE FUNCTION stamp_update_log() RETURNS TRIGGER LANGUAGE 'plpgsql' AS $$
BEGIN
  INSERT INTO update_log(table_name) VALUES(TG_TABLE_NAME);
  RETURN NEW;
END
$$;
-- Repeat for each table you need to track:
CREATE TRIGGER sometable_stamp_update_log
 AFTER INSERT OR UPDATE ON sometable
 FOR EACH STATEMENT EXECUTE stamp_update_log();

यह आपको प्रत्येक तालिका अद्यतन के लिए एक पंक्ति के साथ एक तालिका देगा:फिर आप बस यह कर सकते हैं:

SELECT MAX(updated) FROM update_log

अंतिम अद्यतन समय प्राप्त करने के लिए। (यदि आप चाहें तो इसे तालिका द्वारा विभाजित कर सकते हैं)। यह तालिका निश्चित रूप से बढ़ती रहेगी:या तो 'अपडेट' पर एक इंडेक्स बनाएं (जो नवीनतम को बहुत तेज़ बनाना चाहिए) या इसे समय-समय पर छोटा कर दें यदि यह आपके उपयोग के मामले में फिट बैठता है, (उदाहरण के लिए टेबल पर एक विशेष लॉक लें, नवीनतम अपडेट समय प्राप्त करें, फिर यदि आपको समय-समय पर यह जांच करने की आवश्यकता है कि क्या परिवर्तन किए गए हैं तो इसे छोटा करें)।

एक वैकल्पिक दृष्टिकोण- जो मंच पर लोगों का मतलब हो सकता है- डेटाबेस कॉन्फ़िगरेशन में 'log_statement =mod' सेट करना है (या तो क्लस्टर के लिए विश्व स्तर पर, या डेटाबेस या उपयोगकर्ता पर आपको ट्रैक करने की आवश्यकता है) और फिर सभी बयान जो कि डेटाबेस को संशोधित करें सर्वर लॉग पर लिखा जाएगा। फिर आपको सर्वर लॉग को स्कैन करने के लिए डेटाबेस के बाहर कुछ लिखना होगा, उन तालिकाओं को फ़िल्टर करना जिनमें आपकी रुचि नहीं है, आदि।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Plpgsql:मैं घोषणा खंड में चर के लिए मूल्य कैसे निर्दिष्ट कर सकता हूं?

  2. महीनों को छाँटते हुए उन्हें पाठ में परिवर्तित कर रहा हूँ

  3. नोड.जेएस में पोस्टग्रेज (पीजी) क्लाइंट कनेक्शन बंद करना

  4. PostgreSQL चेकपॉइंट सांख्यिकी को मापना

  5. PostgreSQL में डेटस्टाइल कैसे बदलें?