Existe uma maneira de acessar tabelas temporárias de outras sessões no postgres?

17

Estou trabalhando com um aplicativo do Windows que usa um banco de dados (local) do postgres e armazena algumas informações em uma tabela temporária. Eu gostaria de dar uma olhada na tabela temporária, mas pgadmin e dbVis me dizem: ERROR: cannot access temporary tables of other sessionsao tentar consultar os dados. Tentei alterar as permissões do esquema e da tabela, mas isso não pareceu ajudar, embora eu esteja acessando o banco de dados com o mesmo usuário que o próprio programa (pelo menos no dbVis). Existe uma configuração que eu possa alterar no meu banco de dados que me permita ter acesso "raiz" a todas as sessões do meu banco de dados?

newenglander
fonte

Respostas:

14

A falta de acesso a tabelas temporárias em outras sessões não é uma questão de permissões, é uma limitação técnica do design. Um back-end do PostgreSQL não pode acessar tabelas temporárias de outro back-end porque nenhuma limpeza comum para permitir acesso simultâneo é feita para tabelas temporárias.

Na 9.2, você desejará usar uma UNLOGGEDtabela; isso pode ser visível em outras sessões, mas mantém a maioria dos benefícios de desempenho de uma tabela temporária.

Craig Ringer
fonte
11

A resposta curta é não". As tabelas temporárias em outras sessões são invisíveis por design. Não faz diferença se duas sessões tiverem o mesmo usuário. Até:

O daemon autovacuum não pode acessar e, portanto, não pode aspirar ou analisar tabelas temporárias

Jack Douglas
fonte
Quando as tabelas temporárias são descartadas, elas precisam de um vácuo para limpar quaisquer recursos de memória ou disco? Estou tentando resolver esse problema e não tenho certeza se esse fato de que o vácuo automático não pode ver as tabelas temporárias é o motivo do vazamento de memória. Preciso aspirar manualmente?
poshest
"Quando as tabelas temporárias são eliminadas, elas precisam de um vácuo" não, veja aqui . O mesmo vale para todas as tabelas, não apenas para as tabelas temporárias.
Jack Douglas
3

Não sei se isso pode ajudá-lo, mas você pode tentar.

A consulta de tabela do catálogo do sistema a seguir deve poder listar todas as tabelas temporárias criadas em outras sessões no banco de dados:

selecione pn.nspname, pc.relname em pg_class pc, pg_namespace pn em que pc.relnamespace = pn.oid e pc.relname ilike 'your_temp_table_name';

Por documento do PostgreSQL , Temporary tables exist in a special schemae geralmente são criados com o nome como pg_temp_xxx. Então, usando schemaname. relationnameda consulta acima, você poderá consultar sua tabela temporária. Como você pode ver aqui, a tabela temporária é referenciada com o nome qualificado pelo esquema.

Exemplo: select * from pg_temp_20.your_temp_table_name

Gnanam
fonte
1
Obrigado pela dica. Consegui descobrir o nome e o esquema da tabela temporária usando o dbvis (que provavelmente usa a primeira consulta que você mencionou), mas o problema era que eu não podia acessá-los em uma sessão diferente daquela em que eles foram criados.
newenglander