PostgreSQL简单的触发问题

时间:2009-09-12 14:55:47

标签: sql postgresql triggers

触发:

 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仍然是空的......

2 个答案:

答案 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;