postgresql - 我们如何让 “statement_timeout” 在函数内工作?

标签 postgresql postgresql-9.2

我有一个需求,在postgresql中在指定的时间限制内执行查询操作。如果在该时间限制内未执行查询,我们需要捕获异常/操作,并需要终止阻止此查询操作发生的所有其他操作,并执行升级操作。为此,创建的原型(prototype)如下:

CREATE OR REPLACE FUNCTION execute_upgrade_statement(upgrade_stat text) RETURNS int as $$
BEGIN
EXECUTE upgrade_stat;
return 1;
END;
$$
LANGUAGE plpgsql;


CREATE OR REPLACE FUNCTION upgrade_function(upgrade_statement text,upgrading_table text) RETURNS void as $$
DECLARE
   pid INTEGER;
   return_value INTEGER;
   pid_values INTEGER[];
BEGIN
SET statement_timeout TO 6000;
LOOP
BEGIN
select execute_upgrade_statement(upgrade_statement) into return_value; 
if return_value = 1 THEN
raise notice 'Upgrade query performed';
return;
else
continue;
end if;
END;
END LOOP;
exception when query_canceled then
 select into pid_values array_agg(p1.pid) from pg_locks p1 LEFT JOIN pg_stat_activity psa on p1.pid=psa.pid where p1.relation=(select relid from pg_stat_all_tables where relname=upgrading_table) and p1.pid <> pg_backend_pid();
 FOREACH pid IN ARRAY pid_values
 LOOP
 raise notice 'pid value : %',pid;
 perform pg_terminate_backend(pid);
 END LOOP;
END;
$$
LANGUAGE plpgsql; 


begin;
select upgrade_function('statement','table_name');
commit;

这里的statement_timeout在从服务器端调用函数时不会被执行,但在从客户端调用它时会被执行。是否有其他方法可以使 statements_timeout 通过服务器端调用工作,或者是否有其他方法可以在给定的时间限制内执行我的升级操作?

最佳答案

确实不可能从服务器函数内有效更改statement_timeout,它必须在发送顶级查询之前在客户端完成。

在 DBA.SE 上看到类似的问题: Why “SET LOCAL statement_timeout” does not work as expected with PostgreSQL functions?

或者 postgres 邮件列表中的这个帖子,可以追溯到 2007 年,但否定答案仍然适用于当前版本:

statement_timeout doesnt work within plpgsql by design?

关于postgresql - 我们如何让 “statement_timeout” 在函数内工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37873517/

相关文章:

sql - 创建 10 个不同的随机数

用 ddply 或 ply-family 函数的创造性使用替换 R 循环

sql - 使用 POSTGRES 从单个 SELECT 插入 2 个相关表

postgresql - 查询获取表名的子查询

postgresql - Postgres 默认值 NULL 和空字符串

PostgreSQL SELECT-RULES ,继承,行级权限

PostgreSQL - 实现可靠队列

postgresql - 将表名传递给函数并返回表

ruby-on-rails - 思考 sphinx : search across multiple models: best practices?

postgresql - 在 postgresql 中对 array_agg 进行子选择