Postgres - “更新后”触发器不会触发

Postgres - ´after update´ trigger doesn't fire

我有这个 table 其中一列要用相同 table 的其他列的值填充(这些其他列代表我希望其最低级别的分类层次结构存储在另一列中)。

为此,我实现了以下触发器:

CREATE OR REPLACE FUNCTION get_taxon()
RETURNS TRIGGER LANGUAGE plpgsql AS
$BODY$
   BEGIN
    UPDATE taxon SET taxon = coalesce(subespecie, especie, genero, subfamilia, familia, infraordem, subordem, ordem, superordem, subclasse, classe, subphylum, phylum, reino )
    WHERE taxon IS NULL;
    RETURN NEW;
   END
$BODY$
VOLATILE; 

CREATE TRIGGER update_taxon
    AFTER INSERT OR UPDATE ON taxon
    FOR EACH STATEMENT  
    WHEN (pg_trigger_depth() = 0) -- Prevent recursive trigger calls
    EXECUTE PROCEDURE get_taxon(); 

当我插入新记录时,触发器按预期工作,但如果我更新现有记录,则什么也没有发生 - 触发器只是忽略更新操作,我不知道为什么。

任何人都可以解释一下吗?

在您的语句触发器首次触发后,table 中的所有记录应该使用最佳可用信息更新其 taxon 字段。更新记录时,您可能希望更新 taxon 值,但最好使用 BEFORE INSERT OR UPDATE FOR EACH ROW 触发器。当然,唯一的新数据包含在触发触发器的行中。所以试试这个:

CREATE OR REPLACE FUNCTION get_taxon()
RETURNS TRIGGER LANGUAGE plpgsql AS
$BODY$
BEGIN
  NEW.taxon := coalesce(NEW.subespecie, NEW.especie, NEW.genero, NEW.subfamilia, 
                        NEW.familia, NEW.infraordem, NEW.subordem, NEW.ordem, NEW.superordem,
                        NEW.subclasse, NEW.classe, NEW.subphylum, NEW.phylum, NEW.reino);
  RETURN NEW;
END;
$BODY$ VOLATILE; 

CREATE TRIGGER update_taxon
    BEFORE INSERT OR UPDATE ON taxon
    FOR EACH ROW EXECUTE PROCEDURE get_taxon();