2014-11-27 5 views
0

now() 함수를 사용하는 시간 종속 뷰가 있으므로 시간 경과에 따라 값이 변경됩니다.보기에서 트리거를 만듭니다.

아래

단순한 코드 :

DROP VIEW IF EXISTS av; 
DROP TABLE IF EXISTS A; 
CREATE TABLE A (when_epoch_seconds INTEGER, x VARCHAR); 

INSERT INTO A(when_epoch_seconds, x) SELECT CAST (EXTRACT (epoch FROM now()) AS INT), 'x'; 

CREATE VIEW av AS 
WITH cte AS 
(SELECT MAX(when_epoch_seconds) AS latestEntry FROM a) 
SELECT CAST (EXTRACT (epoch FROM now()) AS INT) - cte.latestEntry > 5 AS too_old FROM cte; 

SELECT too_old FROM av; 

내 질문은 내가 지속적으로 예를 들어보기 av과에 열 too_old의 값을 모니터링하는 트리거를 만들 수있는 방법은 "통지"테이블에 행을 삽입 할 때마다 그 값이 true에서 false로 또는 그 반대로 전환됩니까? 아니면 같은 효과를 내기에 더 적합한 다른 메커니즘이 있습니까?

+1

트리거는 테이블의 DML이 실행될 때만 실행됩니다. "* 지속적으로 모니터 *"하는 방아쇠와 같은 것은 없습니다. 당신은 청취/통지를 찾고 있을지도 모른다. http://www.postgresql.org/docs/current/static/sql-listen.html –

+0

테이블 A에서 INSERT 할 때 어떤 일이 필요하지 않지만 5 초 이상 ** 해당 표에 INSERT가 없습니다 **. PostgreSQL만으로는이를 달성 할 수있는 방법이 없습니다. 매초마다 조건을 검사하는 cron 작업을 실행해야합니다. –

답변

1

view은 하나 이상의 테이블에 저장된 값을 반영하는 "가상"테이블입니다. trigger은 특정 이벤트 (INSERT, DELETE 등)가 테이블에서 발생할 때 실행되는 명령어 세트입니다.

는 어떻게 지속적으로보기 AV

당신은보기와 관련된 트리거를 만들 수 없습니다에서 열 too_old의 값을 모니터링하는 트리거를 만들 수 있습니다. 뷰가 값을 "변경"하지 않으면 테이블이 변경됩니다. 뷰는 참조하는 테이블 (들)에 저장된 레코드의 결과 집합입니다. EDIT :보기를 실제로 만들 수 있습니다 (@ MikeSherrill'CatRecall '정확하게 말한 것처럼), in PostgreSQL 9.1. 최신 버전의 엔진에 도입 된 기능입니다. 뷰에 트리거를 만들 수 있다고해도 가장 좋은 방법은 기본 테이블에 트리거를 만드는 것입니다. 내가보기에 그것을 만들 때 실제로 요점은 보이지 않습니다.

항상 실행되는 트리거는 참조 테이블 변경 내용을 수신하지 않습니다. 그것이 존재한다면, 지속적으로 실행되는 트리거는 SQL 엔진의 성능에 심각한 영향을 미치므로 SQL 엔진이 느려지고 쿼리 실행이 매우 느려집니다. 내 생각에 그런 것이 존재하지 않는 주된 이유입니다.

PostgreSQL 엔진에는 참으로 LISTEN이라는 변경 사항을 수신하는 데 도움이되는 유용한 기능이 있습니다.

+0

내가 읽은 것을 토대로,'NOTIFY' /'LISTEN' 메커니즘은 제가 직면하고있는 문제의 핵심을 다루지 않습니다. * 뭔가 *는'NOTIFY'를 호출해야하고, * 뭔가 *는 변경 사항을 감지하기 위해 뷰를 지속적으로 모니터링해야합니다. 그래서 그렇게하는 유일한 방법은 외부 cron 작업 또는 다른 외부 클라이언트를 사용하는 것입니다. PostgreSQL에서 장기 실행 데몬/서비스와 유사한 서버 측 코드에 대한 다른 지원이없는 한. –

+0

* "보기와 관련된 트리거를 만들 수 없습니다."* [뷰에서 트리거를 만들 수 있음] (http://www.postgresql.org/docs/current/static/sql-createtrigger.html). –

+0

@ MikeSherrill'CatRecall '해명 해줘서 고마워. 나는 대답을 업데이트했다. –