【问题标题】:Why am I unable to UPDATE a Postgresql table where I have a TRIGGER defined with BEFORE UPDATE为什么我无法更新使用 BEFORE UPDATE 定义的 TRIGGER 的 Postgresql 表
【发布时间】:2021-12-18 21:29:02
【问题描述】:

在 PostgreSQL 中,我有一个定义了触发器的表,它调用定义的 PostgreSQL 函数。触发器是BEFORE UPDATE。定义触发器后,我无法对相关表进行更新。如果我将触发器重新定义为 AFTER UPDATE 一切正常。关于为什么的任何想法? 该表类似于以下内容:

create table user (
id bigserial constraint pk_userprimary key,
username                 varchar,
hasreadinstructions      smallint,
hasstarted               smallint,
hasendeddataentry        smallint,
hasviewedresults         smallint,
email                    varchar,
firstname                varchar,
lastname                 varchar,
registrationdate         timestamp);

而功能是:

create function perform_notify() returns trigger
language plpgsql
as
$$
BEGIN
   PERFORM pg_notify('has_read_instructions', 'foo');
   RETURN NULL;
END;
$$;

触发器是:

CREATE TRIGGER has_read_instructions BEFORE UPDATE
ON user FOR EACH ROW EXECUTE PROCEDURE
perform_notify();

如果我用 BEFORE UPDATE 定义触发器,如图所示,对表的更新不起作用,例如:

update user set hasreadinstructions = 1 where id = 1;

结果是UPDATE 0,值不变。

如果我将触发器更改为 AFTER UPDATE,一切似乎都很好,并且我对表的更新工作正常,结果是 UPDATE 1,值被更改。

在这种情况下,我并不特别关心我是使用BEFORE 还是AFTER,但我不知道为什么;因此,对于理解这一点的任何帮助将不胜感激。

【问题讨论】:

    标签: postgresql triggers notify pg-notify


    【解决方案1】:

    引用the documentation:

    BEFORE 触发的行级触发器可以返回 null 以指示触发器管理器跳过该行的其余操作(即,不触发后续触发器,INSERT/UPDATE/@987654325此行不出现@)。

    换句话说,通过返回null,您将中止update 操作。相反,您可以返回新行:

    create function perform_notify() returns trigger
    language plpgsql
    as
    $$
    BEGIN
       PERFORM pg_notify('has_read_instructions', 'foo');
       RETURN NEW; -- Here!
    END;
    $$;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-01
      • 1970-01-01
      • 2017-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-26
      • 1970-01-01
      相关资源
      最近更新 更多