2014-12-02 38 views
0

我有與NEXTVAL給所有序列連接在一起的查詢: 等待序列獲得LAST_VALUE

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

你想通過這樣做完成什麼?你試圖解決的根本問題是什麼?你不應該這樣做。 – 2014-12-02 08:46:23

+0

你是什麼意思?「有沒有辦法等待所有序列完成而不鎖定所有表?」 ?一個序列根本不會鎖定,你總能得到這個序列的當前值。 – 2014-12-02 08:53:15

+0

@FrankHeikens它似乎鎖定序列,而使用這個序列的事務還沒有完成。我還沒有放棄它。 – iRaS 2014-12-02 09:00:06

回答

1

ERROR: cannot access temporary tables of other sessions

在另一個會話中你要創建一個臨時序列。您現在正試圖爲此序列獲取或設置一個值,但它在當前會話中不可見。臨時表和序列僅對創建此對象的會話可見。

解決方案:將臨時序列保留在查詢之外。

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