等待序列获得last_value

时间:2014-12-02 08:18:14

标签: postgresql

我有一个查询,它将所有序列与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;

1 个答案:

答案 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%';