触发:
CREATE TRIGGER "tr_update_ts" BEFORE INSERT OR UPDATE
ON "public"."test" FOR EACH ROW
EXECUTE PROCEDURE "public"."update_ts"();
,功能是:
CREATE OR REPLACE FUNCTION "public"."update_ts" () RETURNS trigger AS
$body$
DECLARE
BEGIN
NEW.ts := now();
RETURN NEW;
END;
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
为什么这不起作用?没有抛出错误,但是ts仍然是空的......
答案 0 :(得分:3)
我测试了你的代码并且它有效:
首先,让我们创建表:
# create table test (x int4, ts timestamptz);
CREATE TABLE
现在,让我们添加功能:
# CREATE OR REPLACE FUNCTION "public"."update_ts" () RETURNS trigger AS
>> $body$
>> DECLARE
>> BEGIN
>> NEW.ts := now();
>> RETURN NEW;
>> END;
>> $body$
>> LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;
CREATE FUNCTION
最后,添加一个触发器:
# CREATE TRIGGER "tr_update_ts" BEFORE INSERT OR UPDATE
>> ON "public"."test" FOR EACH ROW
>> EXECUTE PROCEDURE "public"."update_ts"();
CREATE TRIGGER
所以,现在,让我们测试ON INSERT的一部分:
# insert into test (x) values (1);
INSERT 0 1
# select * from test;
x | ts
---+-------------------------------
1 | 2009-09-12 19:54:50.812139+02
(1 row)
显然它有效。
现在,更新:
# update test set x = 2;
UPDATE 1
# select * from test;
x | ts
---+-------------------------------
2 | 2009-09-12 19:54:57.463933+02
(1 row)
ts已经改变。很明显,您显示的代码有效,因此错误必须在其他地方。
向我们展示psql的“\ d test”输出和触发器函数的\ df +。
答案 1 :(得分:0)
您的创建功能的完整语法是什么?这是我创建的函数的完整语法,它按预期工作。
create function update_timestamp() RETURNS trigger AS $$
BEGIN
NEW.ts := now();
RETURN NEW;
END;
$$ language plpgsql;