堆栈深度限制 INSERT 触发器

Posted

技术标签:

【中文标题】堆栈深度限制 INSERT 触发器【英文标题】:Stack depth Limit INSERT trigger 【发布时间】:2017-03-29 15:49:23 【问题描述】:

我在 PostgreSQL 上有这个表,我想创建一个触发器,每次我编辑表中的一行 publications 时,last_edit_date 都会更新为 now()

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
);

我正在使用 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()

这到底是什么意思?它与我的触发器或任何其他定义有关吗?

【问题讨论】:

【参考方案1】:

你的触发器是递归的,即触发器函数执行一个UPDATE再次调用触发器函数。

这里的解决方案是使用BEFORE INSERT OR UPDATE触发器,它修改NEW如下:

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

【讨论】:

什么意思? @Laurenz Albe 类似BEGIN UPDATE publications SET NEW.last_edit_date = CURRENT_TIMESTAMP WHERE publicationid = NEW.publicationid; RETURN NULL; END; 它说不存在新的出版物 不,这是完整的正文(我已经编辑了答案以表明这一点)。没有UPDATE,什么都没有。您所做的只是在插入行之前修改值。不要忘记它必须是 BEFORE 触发器。

以上是关于堆栈深度限制 INSERT 触发器的主要内容,如果未能解决你的问题,请参考以下文章

PostgresQL 中超出堆栈深度限制(删除触发器后)

Firebase“设置”完成回调未触发

oracle触发器中定时执行sql

pt-osc在线工具的使用

pt-osc在线工具的使用

对于INSERT BULK 命令, 怎么建立insert触发器