我有非常简单的触发和触发功能。触发函数应在插入操作后的每一行中插入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
答案 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"
)。他们比值得多麻烦