क्या एक "एक्सपायरी" समय सेट करने का कोई तरीका है, जिसके बाद पोस्टग्रेज़ SQL में डेटा प्रविष्टि स्वचालित रूप से हटा दी जाती है?


107

क्या PostgreSQL में डेटा प्रविष्टियों पर किसी प्रकार का "समाप्ति" समय निर्धारित करने का कोई तरीका है ? मैं EXPIREरेडिस के समकक्ष कुछ के बारे में सोच रहा हूं ।

मैं टाइमस्टैम्प स्टोर करने के लिए नहीं देख रहा हूं और फिर मैन्युअल रूप से कोडन नौकरी के लिए कोड की जांच करने के लिए कि क्या प्रविष्टियों की समय सीमा समाप्त हो गई है।

मैं यह पता लगाने की कोशिश कर रहा हूं कि क्या PostgreSQL में कोई मूल विशेषता है जो इस तरह की कार्यक्षमता प्रदान करेगी, या अगर यह भविष्य के रिलीज के लिए इस तरह की सुविधा का अनुरोध करने के लिए समझ में आता है।


1
Postgresql मेलिंग सूची postgresql.org/message-id/…
vonPetrushev

जवाबों:


105

समाप्ति की सुविधा में कोई निर्मित नहीं है, लेकिन यदि आपका लक्ष्य स्वचालित रूप से फ़ील्ड्स को समाप्त करना है और आपके डेटाबेस में निहित तर्क है (और इस तरह क्रोन जॉब की तरह कोई बाहरी निर्भरता नहीं है) तो आप हमेशा एक ट्रिगर लिख सकते हैं। नीचे एक ट्रिगर का एक उदाहरण है जो एक मेज से पंक्तियों को हटाता है जिसमें 1 मिनट से अधिक पुराना टाइमस्टैम्प है। जब भी कोई नई पंक्ति उसी तालिका में डाली जाती है, तो इसे निष्पादित किया जाता है। आप स्पष्ट रूप से ट्रिगर को अन्य शर्तों पर निष्पादित करने के लिए सेट कर सकते हैं और विभिन्न समाप्ति तिथियों के लिए आवश्यकतानुसार हो सकते हैं। मैंने इसके लिए आधार के रूप में निम्नलिखित वेबसाइट का उपयोग किया: http://www.the-art-of-web.com/sql/trigger-delete-old/

CREATE TABLE expire_table (
    timestamp timestamp NOT NULL DEFAULT NOW(),
    name TEXT NOT NULL
);

INSERT INTO expire_table (name) VALUES ('a');
INSERT INTO expire_table (name) VALUES ('b');
INSERT INTO expire_table (name) VALUES ('c');

select * from expire_table;
         timestamp          | name 
----------------------------+------
 2014-09-26 15:33:43.243356 | a
 2014-09-26 15:33:45.222202 | b
 2014-09-26 15:33:47.347131 | c
(3 rows)

CREATE FUNCTION expire_table_delete_old_rows() RETURNS trigger
    LANGUAGE plpgsql
    AS $$
BEGIN
  DELETE FROM expire_table WHERE timestamp < NOW() - INTERVAL '1 minute';
  RETURN NEW;
END;
$$;

CREATE TRIGGER expire_table_delete_old_rows_trigger
    AFTER INSERT ON expire_table
    EXECUTE PROCEDURE expire_table_delete_old_rows();

INSERT INTO expire_table (name) VALUES ('d');

select * from expire_table;
         timestamp          | name 
----------------------------+------
 2014-09-26 15:36:56.132596 | d
(1 row)

1
@ कैयस शायद कैशिंग और इंडेक्सिंग पर निर्भर करता है
निम्रोद

39
-1। Imho, ट्रिगर्स गायब डेटाबेस सुविधाओं से निपटने का तरीका नहीं है, क्योंकि ट्रिगर्स का परीक्षण कठिन है, बनाए रखने में मुश्किल है और सिर्फ गधे में दर्द है। ईमानदार रहें और इसे अपने आवेदन में लागू करें। :)
बैस्टियन वोइग्ट

2
सहमत हूं, मुझे लगता है कि पुराने रिकॉर्ड की जांच करें और प्रत्येक प्रविष्टि पर इसे हटा दें प्रदर्शन के मामले में वास्तव में भयानक समाधान है। उदाहरण के लिए, SQL को निष्पादित करने वाली CRON जॉब स्क्रिप्ट जैसी किसी चीज़ को सेटअप करना कठिन नहीं है।
झारकॉन

अगर समाप्ति समय पर एक सूचकांक है, तो perfprmance काफी अच्छा होना चाहिए।
जैसन

2
ब्रेट के समाधान के लिए +1। सत्र तालिका की तरह कुछ के लिए जहां आप केवल एक ही सत्र के लिए एक उपयोगकर्ता चाहते हैं, मुझे लगता है कि सत्र तालिका में किसी भी INSERT पर ट्रिगर, यह सुनिश्चित करने के लिए कि प्रत्येक उपयोगकर्ता के पास केवल एक सत्र है, एक पूरी तरह से मान्य उपयोग मामला है । लोग अगर कुछ "परीक्षण करने योग्य" है तो वे अधिक जटिल समाधान लिखते हैं (जो तब भारी परीक्षण की आवश्यकता होती है ) के बजाय कुछ सरल फ़ंक्शन के बजाय वे विश्वास नहीं कर सकते हैं कि वे टूट नहीं जाएंगे।
corysimmons

8

नहीं, ऐसी कोई सुविधा नहीं है।

मैं यह नहीं देख सकता कि यह या तो (1) से अधिक "टाइमस्टैम्प" करता है या (2) टाइमस्टैम्प + क्रोन-जॉब / pgAgent।

यह एक सामान्य सुविधा की तरह नहीं है जो कोर में जोड़ा जाएगा। आप इस प्रकार की चीज़ को संभालने के लिए एक एक्सटेंशन को आसानी से कोड कर सकते हैं , या तो एक क्रोन-जॉब से बुलाया एक टिक या शायद एक पृष्ठभूमि-कार्यकर्ता प्रक्रिया।

मुझे pgxn पर कुछ भी दिखाई नहीं दे रहा है , इसलिए संभवत: अभी तक इसकी ज्यादा मांग नहीं है।


3
मुझे पता है कि यह उत्तर पुराना है, लेकिन IMO यह एक अविश्वसनीय रूप से उपयोगी सुविधा है, जैसे: docs.mongodb.com/manual/core/index-ttl
Madbreaks

Postgresql में इस सुविधा को जोड़ने के लिए बहुत सारे काम करने की आवश्यकता होगी, उदाहरण के लिए, विदेशी कुंजी निर्माण के लिए विभिन्न नियमों की आवश्यकता होगी ...
जैसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.