为什么我无法更新 Postgresql table,其中我有一个用 BEFORE UPDATE 定义的 TRIGGER

Why am I unable to UPDATE a Postgresql table where I have a TRIGGER defined with BEFORE UPDATE

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

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 定义触发器,如图所示,对 table 的更新不起作用,例如:

update user set hasreadinstructions = 1 where id = 1;

结果为UPDATE 0,值不变。

如果我将触发器更改为 AFTER UPDATE,一切似乎都很好,我对 table 的更新与结果一起工作更新 1,值被更改。

在这种情况下,我并不特别在意我是使用BEFORE还是AFTER,但我不知道为什么;因此,如果能帮助理解这一点,我们将不胜感激。

引用the documentation:

Row-level triggers fired BEFORE can return null to signal the trigger manager to skip the rest of the operation for this row (i.e., subsequent triggers are not fired, and the INSERT/UPDATE/DELETE does not occur for this row).

换句话说,通过 returning null,您正在中止 update 操作。相反,您可以 return 新行:

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