有没有办法在postgres中访问其他会话的临时表?


17

我正在使用Windows应用程序,该应用程序使用(本地)postgres数据库并将一些信息存储在临时表中。我想看一下临时表,但是pgadmin和dbVis告诉我:ERROR: cannot access temporary tables of other sessions尝试查询数据时。我尝试更改模式和表的权限,但这似乎无济于事,即使我使用与程序本身相同的用户访问数据库(至少在dbVis中也是如此)。我是否可以在数据库中更改设置,以使我能够“ root”访问数据库中的所有会话?

Answers:


14

在其他会话中缺少对临时表的访问权限不是权限问题,这是设计的技术限制。PostgreSQL后端无法访问另一个后端的临时表,因为对临时表没有任何允许并发访问的常规内务处理。

在9.2版中,您将改为使用UNLOGGED表格;这可以从其他会话中看到,但是保留了临时表的大多数性能优势。


11

最简洁的答案是不”。其他会话中的临时表在设计上是不可见的。如果两个会话具有相同的用户,则没有区别。甚至:

autovacuum守护程序无法访问,因此无法清理或分析临时表


删除临时表后,它们是否需要清理所有内存或磁盘资源的空间?我正在尝试解决此问题,并且不确定是否autovacuum无法看到临时表这一事实是内存泄漏的原因。我需要手动吸尘吗?
华丽的

“删除临时表时,它们需要真空吗?”不,请参见此处。对于任何表,不仅是临时表,都是如此。
杰克·道格拉斯

3

我不知道这是否可以帮助您,但是您可以尝试一下。

以下系统目录表查询应能够列出数据库中其他会话中创建的所有临时表:

从pg_class pc中选择pn.nspname,pc.relname,pg_namespace pn,其中pc.relnamespace = pn.oid和pc.relname都类似于'your_temp_table_name';

根据PostgreSQL 文档Temporary tables exist in a special schema通常以名称创建pg_temp_xxx。因此,使用schemanamerelationname从上面的查询中,您应该能够查询临时表。如您在这里看到的,临时表是使用模式限定名称来引用的。

例: select * from pg_temp_20.your_temp_table_name


1
谢谢你的提示。我能够使用dbvis查找临时表的名称和架构(它可能使用您提到的第一个查询),但是问题是我无法从会话中访问它们,而不能在其中创建它们。
newenglander 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.