postgresql 使用日志表跟踪postgres中长时间运行的触发器的执行

nvbavucw  于 2023-03-29  发布在  PostgreSQL
关注(0)|答案(1)|浏览(146)

我有一些长时间运行的触发器,执行非常长的计算。我想通过插入到日志表中来提供一些可见性,本质上是raise warning的存档版本。我的问题是记录只在触发器完成时显示,有什么方法可以实现这一点吗?
我最初用这个插入到登录表中来替换我的两个触发器的Raise警告,有趣的是,其中一个触发器直到今天都是这样的,另一个没有。
我曾尝试在触发器中使用保存点和开始/ 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;
$$;
sxissh06

sxissh061#

这不是一个理想的解决方案,但这对我的工作在我的限制,并可能是有用的其他人在类似的困境.我测试,它工作正常,当然使用密码是丑陋的地狱,并不太安全.

CREATE OR REPLACE PROCEDURE log_progress(username varchar, pricing_id varchar, version integer, caller varchar, status varchar, message varchar, percentage float)
    language plpgsql
AS $$
BEGIN
    PERFORM dblink('dbname=ekfc password=O6c04N9sffssfswrGt1ertbhT9',
        format( 'insert into administration.logging_activity values(%L, %L, %L, %L, %L, %L, %L)',
            clock_timestamp() , pricing_id, version, caller, status, message, percentage));
END;
$$;

create or replace function test_and_drop() returns integer
    cost 10
    language plpgsql
as
$$
    DECLARE
        i integer;
    BEGIN
        for i in 1..5 loop
            CALL log_progress( 'postgres', '2023-02-29-XXX-098189598535351', i, 'testing', 'RUNNING', 'Pricing proposal', 0.1);
            PERFORM pg_sleep(5);
        end loop;
        return i;
    END;
$$;

select test_and_drop();
```## Heading ##

相关问题