这个 postgres 触发函数有啥问题?

Posted

技术标签:

【中文标题】这个 postgres 触发函数有啥问题?【英文标题】:What's wrong with this postgres trigger function?这个 postgres 触发函数有什么问题? 【发布时间】:2021-02-10 21:53:33 【问题描述】:

我是 postgres 的新手,创建了这个触发器函数来将一个更大的表汇总到另一个表中,当我在查询工具中运行它时,我正在使用 pgAdmin,什么都不会发生它不会给我错误或给我任何错误成功的消息,有什么问题?

CREATE OR REPLACE FUNCTION insert_sum_usage() RETURNS trigger AS $insert_sum_usage$
DECLARE t timestamptz;
DECLARE u double precision;
BEGIN
t=(SELECT time FROM public.temp_time  where id=1 ); 
IF ( t  >  now() - interval '600 seconds')
THEN RETURN NEW;
ELSE
    u=(SELECT SUM(value)  FROM public.temp_usage WHERE labels[12] = 46  AND (labels[3] = 32 OR labels[3] = 62));
    INSERT INTO public.temp_sum_usage VALUES (NEW.time, u);
    UPDATE public.temp_time SET  time=NEW.time WHERE id=1;
RETURN NEW;
END IF;
END; 
$insert_sum_usage$ LANGUAGE plpgsql;

CREATE TRIGGER insert_sum_usage AFTER INSERT OR UPDATE ON public.temp_usage FOR EACH ROW EXECUTE PROCEDURE insert_sum_usage();

【问题讨论】:

停下来,只是不要。数据应保持无冗余以避免出现不一致的可能性。因此,将一张表上的总和写入另一张表并不是一件好事。如果您需要总和,您可以随时查询并获得 正确 结果。为方便起见,您可以创建一个存储此类查询的视图,因此不必每次都重复。 我认为您的触发器定义没有问题,除了上面评论中的概念性定义。 Bot 我无法遵循逻辑。请更详细地描述你的意图,并描述你的代码究竟是如何行为不端的。 我发现了问题,这个触发器需要很多时间来执行,并且在主表中的插入率很大并且它会产生一个巨大的队列并且它在这个过程中产生了问题,我应该使用 cron 这样做,@sticky bit 你说得对,我的方法是最糟糕的选择 【参考方案1】:

很难说,为什么这个触发器什么都不做。有很多约束,可能一个约束可能是错误的。对于这种情况,RAISE NOTICE 语句是您最好的朋友。您可以看到进程离开触发器的一些变量或点的值:

IF ( t  >  now() - interval '600 seconds')
  RAISE NOTICE 'fast leaving (%, %)', t, now();
  THEN RETURN NEW;
ELSE
  ...

请注意:PLpgSQL 不是基于 C 的语言,因此 IF 表达式周围的括号是无用的。

【讨论】:

我发现了问题,这个触发器需要很多时间来执行,并且在主表中的插入率很大并且它会产生一个巨大的队列并且它在这个过程中产生了问题,我应该使用 cron 这样做,感谢重播;-)

以上是关于这个 postgres 触发函数有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

使用 postgres 构建一个触发器函数来处理 json 数据

如何创建一个 Postgres 11 触发器函数,该函数在插入或更新到表“a”时在表“b”中插入一个新行?

Postgres - 连接三个表并在查询中对数据使用聚合函数

Postgres 创建触发器函数以在允许插入之前将值从一列复制到另一列

postgrey9.5哪年

在 Postgres 上使用 pl/Python 创建触发器