我有一个查询,它将所有序列与nextval一起提供:
SELECT c.oid::regclass, setval(c.oid, nextval(c.oid), false)
FROM pg_class c
WHERE c.relkind = 'S'
但它会在生产数据库上抛出错误:
ERROR: cannot access temporary tables of other sessions
我还创建了一个带有last_value的函数(以避免设置序列值),就像在这篇文章Get max id of all sequences in PostgreSQL
中一样这没有用。
有没有办法等待所有序列完成而不锁定所有表?
这就是我的功能
CREATE TYPE tp_sequencedetails AS (sequence_name text, last_value bigint);
CREATE OR REPLACE FUNCTION getsequenceswithdetails()
RETURNS SETOF tp_sequencedetails AS
$BODY$
DECLARE
returnrec tp_sequencedetails;
sequence_name text;
BEGIN
FOR sequence_name IN (SELECT c.oid::regclass FROM pg_class c WHERE c.relkind = 'S')
LOOP
FOR returnrec IN EXECUTE 'SELECT ''' || sequence_name || ''', last_value FROM ' || sequence_name
LOOP
RETURN NEXT returnrec;
END LOOP;
END LOOP;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
答案 0 :(得分:2)
错误:无法访问其他会话的临时表
在另一个会话中,您将创建一个临时序列。您现在正在尝试获取或设置此序列的值,但它在您当前的会话中不可见。临时表和序列仅对创建此对象的会话可见。
解决方案:将临时序列保留在查询之外。
SELECT c.oid::regclass, setval(c.oid, nextval(c.oid), false)
FROM pg_class c
JOIN pg_namespace ON pg_namespace.oid = relnamespace
WHERE c.relkind = 'S'
AND nspname NOT ILIKE 'pg_temp%';