Postgres触发器和生产者(关系的“新”列不存在)

时间:2019-02-01 02:56:47

标签: postgresql triggers

我正在尝试创建一个触发器和过程来在UPDATE和INSERT时更新last_changed_timestamp列。

我可以注册该函数并触发就很好,但是当我尝试更新记录时,我会收到错误消息。

CREATE OR REPLACE FUNCTION update_my_table_last_changed_timestamp()
        RETURNS trigger AS
$BODY$
BEGIN
        UPDATE my_table SET NEW.last_changed_timestamp = NOW();  
        RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;


CREATE TRIGGER trigger_update_my_table_last_changed_timestamp 
  BEFORE UPDATE
  ON my_table
  FOR EACH ROW
  EXECUTE PROCEDURE update_my_table_last_changed_timestamp();

column "new" of relation "my_table" does not exist

我也不完全了解update_my_table_last_changed_timestamp如何知道它应该更新的行,或者是否有传递给它的参数,如何从触发器到过程中获取这些变量。

2 个答案:

答案 0 :(得分:1)

修改NEW记录,无需更新。

BEGIN
    NEW.last_changed_timestamp = NOW();  
    RETURN NEW;
END;

阅读文档:Overview of Trigger Behavior

答案 1 :(得分:0)

如果您仍想访问更新触发器中的(其他)表。

您可以在触发器正文的开头添加以下内容:

EXECUTE format('SET search_path TO %I', TG_TABLE_SCHEMA);

由于更新触发器的某种原因,您可能没有在正确的 search_path 上(我相信一些旧的 psql 版本有这个)