postgreSQL上的max_stack_depth触发器执行

时间:2016-03-30 11:05:51

标签: postgresql triggers

我有非常简单的触发和触发功能。触发函数应在插入操作后的每一行中插入GUID。

SQL:

CREATE TABLE "USERS"
(
  id integer,
  guid uuid,
  name text
)

触发功能:

CREATE OR REPLACE FUNCTION insertGUID() RETURNS trigger AS
$BODY$BEGIN
    INSERT INTO "USERS" ("guid") VALUES (md5(random()::text || clock_timestamp()::text)::uuid);
END$BODY$
LANGUAGE plpgsql;

触发:

CREATE TRIGGER example_trigger BEFORE INSERT ON "USERS" EXECUTE PROCEDURE insertGUID();

但是每次插入之后。像:

INSERT INTO "USERS"(name)  VALUES ('foo1');

我收到错误:max_stack_depth

CONTEXT: SQL: "INSERT INTO "USERS" ("Joe") VALUES (md5(random()::text || clock_timestamp()::text)::uuid)"

UPD:即使我使用BEFORE INSERT

,我也遇到了同样的问题

1 个答案:

答案 0 :(得分:1)

你的insert触发插入新行的触发器,然后触发触发器,该触发器插入一个新行,触发触发器,插入新行,触发插入新行的触发器....(你得到的图片)。

您希望更改新行,而不是插入新行。所以你的触发功能必须是这样的:

CREATE OR REPLACE FUNCTION insertGUID() 
  RETURNS trigger AS
$BODY$BEGIN
    new.guid := md5(random()::text || clock_timestamp()::text;
    return new;
END$BODY$
LANGUAGE plpgsql;

为此,触发器本身必须定义为before insert

CREATE TRIGGER example_trigger 
    BEFORE INSERT ON "USERS" EXECUTE PROCEDURE insertGUID();

不相关,但是:您应该确实避免使用带引号的标识符("USERS")。他们比值得多麻烦