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

时间:2016-03-14 23:28:16

标签: postgresql triggers auto-update

我有这个表,其中一列用同一个表的其他列填充值(这些其他列表示我想在其他列中存储的最低级别的分类层次结构)。

为实现这一目标,我实施了以下触发器:

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(); 

当我插入新记录时,触发器按预期工作,但如果我更新现有记录,则没有任何反应 - 触发器只是忽略UPDATE操作而我不知道原因。

有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:1)

在您的语句触发器首次触发后,表中的所有记录都应使用最佳可用信息更新其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();