PostgreSQL'de bir veri girişinin otomatik olarak silinmesinden sonra “sona erme” süresi belirlemenin bir yolu var mı?


109

PostgreSQL'de veri girişlerinde bir çeşit "sona erme" süresi ayarlamanın bir yolu var mı ? EXPIRERedis'e eşdeğer bir şey düşünüyorum .

Bir zaman damgası kaydetmek ve ardından hangi girişlerin süresinin dolduğunu kontrol etmek için bir tür cron işini manuel olarak kodlamak istemiyorum .

PostgreSQL'de bu tür işlevselliği sağlayacak herhangi bir yerel özellik olup olmadığını veya gelecekteki sürümler için bu tür bir özelliği talep etmenin mantıklı olup olmadığını bulmaya çalışıyorum.


1
Postgresql posta listesinde tartışma oldu postgresql.org/message-id/…
vonPetrushev

Yanıtlar:


107

Yerleşik bir sona erme özelliği yoktur, ancak amacınız alanları otomatik olarak sona erdirmek ve veritabanınızda bulunan mantığa sahip olmaksa (ve dolayısıyla bir cron işi gibi dış bağımlılık yoksa), her zaman bir tetikleyici yazabilirsiniz. Aşağıda, zaman damgası 1 dakikadan daha eski olan bir tablodan satırları silen bir tetikleyici örneği bulunmaktadır. Aynı tabloya yeni bir satır eklendiğinde çalıştırılır. Açıkça tetikleyiciyi diğer koşullarda ve gerektiği gibi çeşitli son kullanma tarihlerinde çalıştıracak şekilde ayarlayabilirsiniz. Bunun için temel olarak aşağıdaki web sitesini kullandım: 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
@caeus muhtemelen önbelleğe alma ve dizine eklemeye bağlıdır
Nimrod

40
-1. Imho, tetikleyiciler, eksik veritabanı özellikleriyle başa çıkmanız gereken yol değildir, çünkü tetikleyicilerin test edilmesi zordur, sürdürülmesi zordur ve sadece baş belasıdır. Dürüst olun ve uygulamanıza uygulayın. :)
Bastian Voigt

2
Katılıyorum, eski kayıtları kontrol etmenin ve her ekte silmenin performans açısından gerçekten korkunç bir çözüm olduğunu düşünüyorum. Örneğin, SQL gerektiren CRON iş betiği gibi bir şeyi kurmak o kadar da zor değil.
zarkone

Son kullanma süresine ilişkin bir dizin varsa performans oldukça iyi olmalıdır.
Jasen

2
Brett'in çözümüne +1. Bir kullanıcının yalnızca tek bir oturuma sahip olmasını istediğiniz bir oturum tablosu gibi bir şey için, her kullanıcının yalnızca bir oturuma sahip olduğundan emin olmak için oturum tablosuna herhangi bir INSERT tetikleyicisinin tamamen geçerli bir kullanım durumu olduğunu düşünüyorum. . İnsanlar, bir şeyin "test edilebilir" olup olmadığına takılırlar, bu yüzden kırılmayacağından emin olabilecekleri basit bir işlev yerine daha karmaşık çözümler (daha sonra yoğun testler gerekir ) yazarlar .
corysimmons

8

Hayır. Böyle bir özellik yok.

Ya (1) sadece "süresi dolmuş" bir zaman damgasından veya (2) zaman damgası + cron-job / pgAgent'tan daha fazlasını ne yaptığını göremiyorum.

Çekirdeğe eklenecek genel bir özellik gibi görünmüyor. Bu tür şeyleri işlemek için bir cron-job'tan çağrılan bir tik veya belki de bir arka plan-çalışan süreci ile bir uzantıyı basitçe kodlayabilirsiniz .

Pgxn'de hiçbir şey görmüyorum , bu yüzden muhtemelen henüz çok fazla talep olmadı.


3
Bu cevabın eski olduğunu biliyorum ama IMO inanılmaz derecede kullanışlı bir özellik, örneğin: docs.mongodb.com/manual/core/index-ttl
Madbreaks

bu özelliği postgresql'e eklemek çok fazla çalışma gerektirir, örneğin, yabancı anahtar oluşturma farklı kurallar gerektirir ...
Jasen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.