2016-03-14 159 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