2017-03-29 5 views
0

나는 PostgreSQL을에이 테이블을 가지고 있고 때마다 내가 publicationslast_edit_datenow()으로 업데이트되는 테이블의 한 행을 편집 트리거하고 싶습니다 : 나는 '스택 깊이 제한 INSERT 트리거

CREATE FUNCTION trigger_update_question_timestamp() 
    RETURNS "trigger" AS $func$ 
BEGIN 
    UPDATE publications SET last_edit_date = now() WHERE publicationid = NEW.publicationid; 
    RETURN NULL; 
END; 
$func$ LANGUAGE plpgsql; 

CREATE TRIGGER answer_update_question_timestamp AFTER INSERT OR UPDATE ON publications 
    FOR EACH ROW EXECUTE PROCEDURE trigger_update_question_timestamp(); 

CREATE TABLE publications 
(
    publicationid SERIAL PRIMARY KEY, 
    body VARCHAR(1000) NOT NULL , 
    creation_date TIMESTAMP DEFAULT now() NOT NULL, 
    userid INTEGER NOT NULL, 
    last_edit_date TIMESTAMP, 
    CONSTRAINT body_length CHECK (CHAR_LENGTH(body) >= 10 AND CHAR_LENGTH(body) <= 1000), 
    CONSTRAINT "FK_publications_users" 
     FOREIGN KEY ("userid") REFERENCES users ("userid") ON DELETE SET NULL ON UPDATE CASCADE 
); 

을 m PhpStorm을 사용하여 수동으로 줄을 편집 할 때 다음 오류가 발생합니다.

[54001] ERROR: stack depth limit exceeded Hint: Increase the configuration parameter "max_stack_depth" (currently 2048kB), after ensuring the platform's stack depth limit is adequate. Where: SQL statement "SELECT 1 FROM ONLY "public"."users" x WHERE "userid" OPERATOR(pg_catalog.=) $1 FOR KEY SHARE OF x" SQL statement "UPDATE publications SET last_edit_date = now() WHERE publicationid = NEW.publicationid" PL/pgSQL function trigger_update_question_timestamp() 

정확히 무엇을 의미합니까? 내 방아쇠 또는 다른 정의와 관련이 있습니까?

답변

2

트리거는 반복적입니다. 즉, 트리거 함수는 UPDATE을 실행하여 트리거 함수를 다시 호출합니다.

BEGIN 
    NEW.last_edit_date := current_timestamp; 
    RETURN NEW; 
END; 
+0

당신은 무엇을 의미합니까 :

여기에이 솔루션은 다음과 같이 NEW을 수정하는 BEFORE INSERT OR UPDATE 트리거를 사용하는 것입니다? @Laurenz Albe 'BEGIN UPDATE publications와 비슷한 것 SET NEW.last_edit_date = CURRENT_TIMESTAMP WHERE publicationid = NEW.publicationid; RETURN NULL; 종료; ' 새로운 출판물이 없다고 말합니다 –

+1

아니요, 이것은 전체 본문입니다 (나는 그것을 나타 내기 위해 답을 편집했습니다). 아니 'UPDATE', 아니 아무것도. 행을 삽입하기 전에 * 값을 수정하면됩니다. 'BEFORE' 트리거 여야한다는 것을 잊지 마십시오. –