Pregunta ¿Hay alguna manera de establecer un tiempo de "caducidad", después de que una entrada de datos se elimina automáticamente en PostgreSQL?


¿Hay alguna manera de establecer algún tipo de tiempo de "caducidad" en las entradas de datos en PostgreSQL? Estoy pensando en algo equivalente a EXPIRE en Redis.

No estoy buscando almacenar una marca de tiempo y luego codificar manualmente algún tipo de cron trabajo para verificar qué entradas han expirado.

Estoy tratando de averiguar si hay alguna característica nativa en PostgreSQL que proporcione este tipo de funcionalidad, o si tendría sentido solicitar dicha característica para futuras versiones.


59
2017-09-25 19:42


origen


Respuestas:


No existe una función de caducidad incorporada, pero si su objetivo es caducar automáticamente los campos y tener la lógica contenida en su base de datos (y por lo tanto no hay dependencia externa como un trabajo cron), entonces siempre puede escribir un desencadenador. A continuación se muestra un ejemplo de un desencadenador que elimina filas de una tabla que tienen una marca de tiempo de más de 1 minuto. Se ejecuta cada vez que se inserta una nueva fila en esa misma tabla. Obviamente, puede configurar el desencadenador para ejecutar en otras condiciones y para varias fechas de caducidad según sea necesario. Utilicé el siguiente sitio web como base para esto: 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)

71
2017-09-26 15:42



No. No hay tal característica.

No puedo ver lo que hace más que (1) solo una marca de tiempo "caducada" o (2) marca de tiempo + cron-trabajo / pgAgent.

No parece una característica general que se agregaría al núcleo. Podrías simplemente codificar una extensión para manejar este tipo de cosas, ya sea con un tick llamado desde un cron-job o quizás un trabajador de fondo proceso.

No veo nada en pgxn, así que presumiblemente no ha habido mucha demanda todavía.


3
2017-09-25 21:13