2017-03-29 16 views
0

は、私は、PostgreSQLにこのテーブルを持っていると私は毎回私はpublicationslast_edit_datenow()に更新されるテーブルの1行を編集トリガーしたいのですが:私は「スタック深さリミット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パブリケーションのようなものSET NEW.last_edit_date = CURRENT_TIMESTAMP where publicationid = NEW.publicationid; RETURN NULL;終わり; ' これは出版物の新版が存在しないと言います –

+1

いいえ、これは完全なボディーです(私はそれを示す答えを編集しました)。 'UPDATE'はありません。 *行が挿入される前の*値を変更するだけです。 'BEFORE'トリガーでなければならないことを忘れないでください。 –

関連する問題