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.