postgres에서 다른 세션의 임시 테이블에 액세스하는 방법이 있습니까?


17

(로컬) postgres 데이터베이스를 사용하고 일부 정보를 임시 테이블에 저장하는 Windows 응용 프로그램으로 작업하고 있습니다. 임시 테이블을보고 싶지만 ERROR: cannot access temporary tables of other sessions데이터를 쿼리하려고 할 때 pgadmin과 dbVis가 알려줍니다 . 스키마와 테이블의 권한을 변경하려고 시도했지만 프로그램과 동일한 사용자 (적어도 dbVis에서)와 동일한 사용자로 데이터베이스에 액세스하더라도 도움이되지 않는 것 같습니다. 데이터베이스의 모든 세션에 대한 "루트"액세스를 허용하는 데이터베이스에서 변경할 수있는 설정이 있습니까?

답변:


14

다른 세션에서 임시 테이블에 액세스 할 수 없다는 것은 권한의 문제가 아니라 디자인의 기술적 한계입니다. PostgreSQL 백엔드 임시 테이블에 대해 동시 액세스를 허용하는 일반적인 하우스 키핑이 없기 때문에 다른 백엔드의 임시 테이블에 액세스 할 수 없습니다 .

9.2에서는 UNLOGGED대신 테이블 을 사용하려고 합니다. 이것은 다른 세션에서 볼 수 있지만 임시 테이블의 성능 이점은 대부분 유지합니다.


11

짧은 대답은 "아니오"입니다. 다른 세션의 임시 테이블 은 의도적 으로 보이지 않습니다 . 두 세션에 동일한 사용자가 있으면 차이가 없습니다. 조차:

autovacuum 데몬은 액세스 할 수 없으므로 임시 테이블을 진공 화하거나 분석 할 수 없습니다


임시 테이블을 삭제할 때 메모리 또는 디스크 리소스를 정리하기 위해 진공이 필요합니까? 이 문제 를 해결하려고하는데 autovacuum이 임시 테이블을 볼 수 없다는 사실이 메모리 누수의 원인인지 확실하지 않습니다. 수동으로 진공 청소해야합니까?
poshest

"임시 테이블을 삭제하면 진공이 필요합니까"아니오, 여기를 참조하십시오 . 임시 테이블뿐만 아니라 모든 테이블에 대해서도 마찬가지입니다.
Jack Douglas

3

이것이 도움이 될지 모르겠지만 시도해 볼 수 있습니다.

다음 시스템 카탈로그 테이블 조회는 데이터베이스의 다른 세션에서 작성된 모든 임시 테이블을 나열 할 수 있어야합니다.

pg_class pc에서 pn.nspname, pc.relname을 선택하십시오. pg_namespace pn 여기서 pc.relnamespace = pn.oid 및 pc.relname ilike 'your_temp_table_name';

PostgreSQL doc 당 , Temporary tables exist in a special schema일반적으로 이름이로 작성됩니다 pg_temp_xxx. 따라서을 사용 schemaname합니다. relationname위 쿼리에서 임시 테이블을 쿼리 할 수 ​​있어야합니다. 여기에서 볼 수 있듯이 임시 테이블은 스키마로 한정된 이름으로 참조됩니다.

예: select * from pg_temp_20.your_temp_table_name


1
팁 고마워. dbvis (아마도 첫 번째 쿼리를 사용함)를 사용하여 임시 테이블의 이름과 스키마를 찾을 수 있었지만 문제는 생성 된 세션 이외의 세션에서 액세스 할 수 없다는 것입니다.
newenglander
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.