【问题标题】:Postgres triggers and producers (column "new" of relation does not exist)Postgres 触发器和生产者(关系的“新”列不存在)
【发布时间】:2019-02-01 02:56:47
【问题描述】:

我正在尝试创建一个触发器和过程以在 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 如何知道它应该更新哪一行,也不知道是否有参数传递给它,我如何将这些变量从触发器获取到过程。

【问题讨论】:

    标签: postgresql triggers


    【解决方案1】:

    修改NEW记录,无需更新。

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

    阅读文档:Overview of Trigger Behavior

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-28
        • 1970-01-01
        • 2014-10-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多