web-dev-qa-db-fra.com

Est-il possible de définir un délai d'expiration après lequel une entrée de données est automatiquement supprimée dans PostgreSQL?

Est-il possible de définir une sorte de "date d'expiration" sur les entrées de données dans PostgreSQL ? Je pense à quelque chose d'équivalent à EXPIRE dans Redis .

Je ne cherche pas à stocker un horodatage puis à coder manuellement une sorte de travail cron pour vérifier quelles entrées ont expiré.

J'essaie de savoir s'il existe une fonctionnalité native dans PostgreSQL qui fournirait ce type de fonctionnalité ou s'il serait judicieux de demander cette fonctionnalité pour les versions ultérieures.

80
Pensierinmusica

Il n’existe pas de fonctionnalité d’expiration intégrée, mais si votre objectif est d’expirer automatiquement les champs et d’avoir la logique contenue dans votre base de données (et donc aucune dépendance extérieure comme un travail cron), vous pouvez toujours écrire un déclencheur. Vous trouverez ci-dessous un exemple de déclencheur qui supprime les lignes d'une table dont l'horodatage est supérieur à 1 minute. Il est exécuté chaque fois qu'une nouvelle ligne est insérée dans cette même table. Vous pouvez évidemment définir le déclencheur pour qu'il s'exécute selon d'autres conditions et pour diverses dates d'expiration, le cas échéant. J'ai utilisé le site Web suivant comme base pour ceci: 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)
86
Brett DiDonato

Non, il n'y a pas une telle fonctionnalité.

Je ne vois pas ce qu'il fait plus que ce soit (1) qu'un timestamp "expiré" ou (2) timestamp + cron-job/pgAgent.

Cela ne ressemble pas à une fonctionnalité générale qui serait ajoutée au noyau. Vous pouvez tout simplement coder un extension pour gérer ce genre de chose, avec un tick appelé depuis un cron-job ou peut-être un processus background-worker .

Je ne vois rien sur pgxn , donc il n'y a probablement pas eu beaucoup de demande pour cela pour le moment.

6
Richard Huxton