PostgreSQL에서 데이터 항목이 자동으로 삭제되는 "만료"시간을 설정하는 방법이 있습니까?


107

PostgreSQL의 데이터 항목에 일종의 "만료"시간을 설정하는 방법이 있습니까? EXPIRERedis 와 동등한 것을 생각하고 있습니다.

타임 스탬프를 저장하고 만료 된 항목을 확인하기 위해 일종의 크론 작업을 수동으로 코딩하려는 것이 아닙니다 .

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
@caeus 아마 캐싱 및 색인에 따라 달라집니다
니므롯

39
-1. Imho, 트리거는 테스트하기 어렵고 유지 관리하기 어렵고 엉덩이에 통증이 있기 때문에 누락 된 데이터베이스 기능을 처리해야하는 방법이 아닙니다. 정직하고 응용 프로그램에서 구현하십시오. :)
Bastian Voigt

2
동의합니다. 오래된 레코드를 확인하고 각 삽입에서 삭제하는 것은 성능 측면에서 정말 끔찍한 해결책이라고 생각합니다. 예를 들어 실행되는 CRON 작업 스크립트와 같이 SQL이 필요한 작업도 설정하는 것은 그리 어렵지 않습니다.
zarkone

만료 시간에 대한 인덱스가 있으면 성능이 상당히 좋을 것입니다.
Jasen

2
Brett의 솔루션에 +1. 사용자가 단일 세션 만 갖기를 원하는 세션 테이블과 같은 경우에는 세션 테이블에 대한 INSERT에 대한 트리거가 각 사용자에게 세션이 하나만 있는지 확인하는 것이 완벽하게 유효한 사용 사례라고 생각합니다. . 사람들은 무언가가 "테스트 가능"한지에 집착하여 고장 나지 않을 것이라고 확신 할 수있는 간단한 기능보다 더 복잡한 솔루션 (그런 다음 무거운 테스트 가 필요함 )을 작성합니다.
코리 시몬

8

아니요. 그러한 기능은 없습니다.

(1) "만료 된"타임 스탬프가 수행하는 작업 또는 (2) 타임 스탬프 + cron-job / pgAgent보다 더 많은 작업을 수행하는 것을 볼 수 없습니다.

코어에 추가되는 일반적인 기능처럼 들리지 않습니다. cron-job 또는 백그라운드 작업자 프로세스 에서 호출 된 틱을 사용하여 이러한 종류의 작업을 처리 하는 확장 을 아주 간단하게 코딩 할 수 있습니다.

나는 pgxn 에서 아무것도 볼 수 없으므로 아마도 아직 그것에 대한 수요가 많지 않을 것입니다.


3
이 답변이 오래 되었다는
Madbreaks

이 기능을 postgresql에 추가하려면 많은 작업이 필요합니다. 예를 들어 외래 키 생성에는 다른 규칙이 필요합니다.
Jasen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.