2016-03-14 178 views
1

我有这张表,其中一列要填写来自同一表的其他列的值(这些其他列表示分类层次结构,其最低级别希望以存储在这个其他列)。Postgres - 'after 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

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

谢谢Patrick!这就像一个魅力!一个问题,但。即使在阅读官方Postgres文档之后,我也不清楚为什么在这种情况下BEFORE触发器比AFTER更好。据我所知,在触发器被触发之前,触发器被触发之前,相关的事件被提交给数据库,但在这种情况下,这与触发事件提交给数据库之后的触发器不同? – Lisdengard