gpt4 book ai didi

Postgresql 忽略触发器上的 'when' 条件

转载 作者:行者123 更新时间:2023-11-29 13:40:35 24 4
gpt4 key购买 nike

触发器似乎忽略了我定义中的“when 条件”,但我不确定为什么。我正在运行以下内容:

create trigger trigger_update_candidate_location
after update on candidates
for each row
when (
OLD.address1 is distinct from NEW.address1
or
OLD.address2 is distinct from NEW.address2
or
OLD.city is distinct from NEW.city
or
OLD.state is distinct from NEW.state
or
OLD.zip is distinct from NEW.zip
or
OLD.country is distinct from NEW.country

)
execute procedure entities.tf_update_candidate_location();

但是当我重新检查它时,我得到以下信息:

-- auto-generated definition
create trigger trigger_update_candidate_location
after update
on candidates
for each row
execute procedure tf_update_candidate_location();

这是有问题的,因为我调用的过程最终会针对不同的列 (lat/lng) 对同一张表进行更新。由于 'when' 条件被忽略,这会产生一个无限循环。

我的目的是观察地址变化,在另一个表上查找以获得纬度/经度值。

PostgreSQL 版本:10.6集成开发环境:DataGrip 2018.1.3

最佳答案

您究竟是如何创建和“检查”的?用数据夹?

WHEN 条件是 Postgres 9.0 添加的。一些老的(或差的)客户可能已经过时了。可以肯定的是,使用以下命令检查 pgsql:

SELECT pg_get_triggerdef(oid, true)
FROM pg_trigger
WHERE tgrelid = 'candidates'::regclass -- schema-qualify name to be sure
AND NOT tgisinternal;

任何实际的 WHEN 条件都以内部格式存储在 pg_trigger.tgqual 中,顺便说一句。手册中的详细信息here .

另外,您当前的 search_path 是什么?表 candidates 的架构是什么?

值得注意的是,表 candidates 是不合格的,而触发函数 entities.tf_update_candidate_location() 具有模式限定...您没有混淆表在不同的数据库架构中使用相同的名称,是吗?

除此之外,您可以使用这个更短的等效语法来简化:

create trigger trigger_update_candidate_location
after update on candidates -- schema-qualify??
for each row
when (
(OLD.address1, OLD.address2, OLD.city, OLD.state, OLD.zip, OLD.country)
IS DISTINCT FROM
(NEW.address1, NEW.address2, NEW.city, NEW.state, NEW.zip, NEW.country)
)
execute procedure entities.tf_update_candidate_location();

关于Postgresql 忽略触发器上的 'when' 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55934421/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com