You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 11:17:22