2014-12-02 2 views
0

i를 NEXTVAL와 함께 모든 시퀀스를 제공하는 쿼리가 : 나는 '기다립니다 얻을 수 LAST_VALUE

ERROR: cannot access temporary tables of other sessions 

:

SELECT c.oid::regclass, setval(c.oid, nextval(c.oid), false) 
FROM pg_class c 
WHERE c.relkind = 'S' 

는하지만 프로덕션 데이터베이스에 오류가 발생합니다 또한이 게시물에서와 같이 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

이렇게하면 무엇을하려합니까? 해결하려는 근본적인 문제는 무엇입니까? 당신은 이것을 할 필요가 없습니다. –

+0

"모든 테이블을 잠그지 않고 모든 시퀀스가 ​​완료 될 때까지 기다릴 수있는 방법이 있습니까?" ? 시퀀스가 전혀 잠그지 않으면 항상이 시퀀스의 현재 값을 가져올 수 있습니다. –

+0

@FrankHeikens이 시퀀스를 사용하는 트랜잭션이 아직 완료되지 않은 동안 시퀀스를 잠그는 것 같습니다. 나는 아직 그것을 debuged하지 않았습니다. – iRaS

답변

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