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();
我有这个 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();