postgresql - 为什么 postgresql 触发器不启动?
问题描述
我使用 postgresql 11。我认为我的问题来自一个不进行更新的触发器,因此下一个触发器不会启动。
我有一个projet
带有列的表: projet_temps_doe
,,,projet_temps_etudes
。projet_temps_globale
目标是根据其他列的值更新每一列。这个想法是:projet_temps_globale
= projet_temps_doe
+ projet_temps_etudes
。
我有一个projet_temps_doe
完美运行的第一个触发器:
create function temps_globale_doe() returns trigger
language plpgsql
as
$$
begin
new.projet_temps_globale_doe := new.projet_temps_doe_gc_bts + new.projet_temps_doe_gc_nra;
return new;
end;
$$;
CREATE TRIGGER temps_globale_doe
BEFORE UPDATE OF projet_temps_doe_gc_bts, projet_temps_doe_gc_nra
ON public.projet
FOR EACH ROW
EXECUTE PROCEDURE public.temps_globale_doe();
我有一个类似的触发器,projet_temps_etudes
它也可以完美地工作。
然后是我挣扎的触发器projet_temps_globale
:
create trigger maj_temps_globale_projet
before update of projet_temps_doe, projet_temps_etudes on projet
for each row
execute procedure maj_temps_globale_projet();
create or replace function maj_temps_globale_projet()returns trigger
language plpgsql
as
$$
begin
new.projet_temps_globale := new.projet_temps_doe + new.projet_temps_etudes;
raise info 'TEST!!';
return new;
end;
$$;
当projet_temps_doe
和/或projet_temps_etudes
通过触发器更新时,我的最后一个触发器没有启动。但是,当我手动更改projet_temps_doe
和/或projet_temps_etudes
值时,触发器 maj_temps_globale_projet 被触发。
我想从中吸取教训,所以,如果可能的话,向我解释我在这里做错了什么,或者我的方法是否缺乏洞察力。
解决方案
医生说_
仅当列出的列中的至少一个列被提及为 UPDATE 命令的目标时,触发器才会触发。
该列projet_temps_globale_doe
不是更新命令的一部分,而是设置在另一个触发器中,new.projet_temps_globale_doe = ...
因此不会调用此特定列上的触发器。
在整个表上只设置一个触发器来设置 3 个派生值会更容易。
推荐阅读
- google-apps-script - 从 Rhino 切换到 V8 导致错误代码 PERMISSION_DENIED
- r - 部署以生成网站后出现闪亮错误
- sql - 雪花 - 检查字符串是否为字母数字?
- docker - Artifactory 在每次重新启动时重新创建内置证书
- solr - 用于翻译文档索引的 apache solr
- python - 如何根据条件将数据框中的列合并到另一个?
- sinatra - sinatra v1.4.8 没有从配置中选择正确的端口
- python - 绘制多种算法的精确召回曲线
- asp.net-core - 将 .Net Core 3.1 Web 应用程序部署到 IIS 后登录问题
- memory - 使用 posix_memalign 将数组初始化为零?