sql - PostgreSQL 简单触发器问题

标签 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 仍然为空...

最佳答案

我测试了你的代码并且它有效:

首先,让我们创建表:

# 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+。

关于sql - PostgreSQL 简单触发器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1415305/

相关文章:

mysql - 将多行更新为另一个表中的值 (FK)

sql - 带有列表参数和 in 子句的 Postgres 函数

php - 使用 PHP/PDO 将 .txt 文件复制到 Postgres 中

mysql - 错误 1288 : The target table is not updatable in MySQL trigger

sql - 使用触发器计算SQLite中行之间的差异

MySQL 触发器 - 将 SELECT 存储在变量中

sql - 行数据到列

php - PHP 查询中的左大括号和大括号是什么意思?

mysql - 选择从特定日期开始的MySQL数据

postgresql - 如何更改 Heroku 上的 postgres random_page_cost?