2013-06-18 3 views
0

두 테이블, 및 subtasks이 있습니다. 모든 하위 작업은 상태가 있습니다 (처음 삽입 될 때 보류 중). 그런 다음 모든 하위 작업을 업데이트하는 스레드를 실행합니다 (상태가 READY가됩니다). 내가 원하는 것은 주어진 작업의 모든 하위 작업이 준비 상태가되고, 부모 작업이 준비 상태가 될 때입니다. 트리거 후 SQL이 올바르게 계산되지 않습니다.

ID Pending_count 
2  3 
1  3 
3  3 
4  3 

그리고 그 위에

, 테스트가 완료된 후 : 나는 하나의 작업 4 개 하위 이것을 테스트 할 때

CREATE FUNCTION update_task_status() RETURNS trigger AS $$ 
    BEGIN 
     INSERT INTO trigger_log SELECT NEW.subtask_id, COUNT(fo_id) FROM subtasks WHERE fo_id = NEW.fo_id AND status <> 'READY'; 

     UPDATE tasks 
     SET status = 'READY' 
     WHERE task_id = NEW.fo_id 
     AND NOT EXISTS (
      SELECT 1 
       FROM subtasks 
       WHERE fo_id = NEW.fo_id 
       AND status <> 'READY' 
      ); 
     RETURN NULL; 
    END; 
$$ LANGUAGE plpgsql; 

CREATE TRIGGER update_task AFTER INSERT OR UPDATE ON subtasks 
FOR EACH ROW EXECUTE PROCEDURE update_task_status(); 

가 여기 trigger_log 테이블에 삽입 될 내용은 다음과 같습니다 여기에 내가 쓴 트리거입니다 , 모든 하위 타스크는 READY 상태에 있지만 주요 타스크는 여전히 보류 중입니다. 기본적으로 트리거는 올바르게 계산되지 않습니다. 어떤 아이디어?

+0

관련 스레드 : http://stackoverflow.com/questions/17112582/trigger-procedure-in-postgresql –

+1

는 동시성 문제처럼 보인다. 병렬 쓰레드가'READ COMMITTED' 고립 모드에서 같은 태스크에 접근한다면, 당신이 얻는 결과가 기대된다. 'SERIALIZABLE' 모드를 고려할 수도 있습니다. –

답변

0

먼저, 여기에서 직렬 가능 모드 (또는 SELECT ... FOR UPDATE)를 사용하는 두 번째 Daniel Vérité의 제안을 원합니다.

그러나 세부 사항에 대한 귀하의 질문은 짧기 때문에 문제가되지 않을 수 있습니다. 확인해야 할 사항은 다음과 같습니다.

  1. 정상적으로 쿼리를 실행하면 예상 한대로 작동합니까? 먼저 쿼리 문제를 해결하십시오. 그렇지 않다면 문제의 원인이되는 데이터를 찾아야합니다. 상태에 문자열을 사용하는 것 같으면 공백과 같이 매우 미묘한 문제 일 수 있습니다.

  2. 방아쇠가 작동합니까? 트리거에 RAISE NOTICE를 추가하여 psql이 실제로 실행되고 있음을 확인할 수 있습니다. 그렇지 않은 경우 이유를 알아야합니다 (사용 중지되었거나 쿼리가 수행중인 것으로 생각하지 않는 경우).

관련 문제