PostgreSQL长运行触发器执行日志实时写入问题及解决尝试
问题描述
我有一些执行耗时计算的长运行触发器,希望通过向日志表插入记录来实现类似RAISE WARNING的归档式可见性,以便实时了解执行状态。但目前日志记录仅在触发器完成后才会显示,请问有没有办法实现实时写入?
最初我用插入日志表的操作替代了两个触发器中的RAISE WARNING,有趣的是其中一个触发器此前一直正常,今日却出现异常——要么确实如此,要么是我们都产生了错觉。
尝试过的无效方案
我尝试在触发器内使用保存点和BEGIN/END块,但没有效果,示例代码如下:
create or replace function test_and_drop() returns integer cost 10 language plpgsql as $$ DECLARE i integer; BEGIN for i in 1..10 loop begin insert into administration.logging_activity values( clock_timestamp(), 'xxx', i, 'test', 'RUNNING', 'test', .0); PERFORM pg_sleep(5); end; end loop; return i; END; $$;
可用解决方案
我找到了一个不太理想但可用的解决方案,基于上述简化代码,实现方式如下:
create or replace function test_and_drop() returns integer cost 10 language plpgsql as $$ DECLARE i integer; BEGIN for i in 1..20 loop PERFORM dblink('host=167.71.00.000 port=5432 dbname=ekfc user=postgres password=000000000000000', format( 'insert into administration.logging_activity values(%L, %L, %L, %L, %L, %L, %L)', clock_timestamp() , '2023-02-29-XXX-098189598535351', i, 'testing', 'RUNNING', 'Pricing proposal', 0.1)); PERFORM pg_sleep(5); end loop; return i; END; $$;
内容的提问来源于stack exchange,提问作者Luis Sisamon
相关产品推荐
相关产品推荐

