Есть ли способ получить доступ к временным таблицам других сессий в postgres?

17

Я работаю с приложением Windows, которое использует (локальную) базу данных postgres и хранит некоторую информацию во временной таблице. Я хотел бы взглянуть на временную таблицу, но pgadmin и dbVis говорят мне: ERROR: cannot access temporary tables of other sessionsпри попытке запроса данных. Я попытался изменить права доступа к схеме и таблице, но это, похоже, не помогло, хотя я обращаюсь к базе данных с тем же пользователем, что и сама программа (по крайней мере, в dbVis). Есть ли параметр, который я могу изменить в своей базе данных, который позволяет мне иметь «root» доступ ко всем сеансам в моей базе данных?

newenglander
источник

Ответы:

14

Отсутствие доступа к временным таблицам в других сеансах - это не вопрос разрешений, это техническое ограничение дизайна. Бэкэнд PostgreSQL не может получить доступ к временным таблицам другого бэкэнда, поскольку для временных таблиц не выполняется ни одна из обычных операций по ведению параллельного доступа.

В 9.2 UNLOGGEDвместо этого вы захотите использовать таблицу; это может быть видно из других сеансов, но сохраняет большинство преимуществ производительности временной таблицы.

Крейг Рингер
источник
11

Короткий ответ - нет". Временные таблицы в других сеансах невидимы . Не имеет значения, если у двух сеансов один и тот же пользователь. Четный:

Демон autovacuum не может получить доступ и поэтому не может очистить или проанализировать временные таблицы

Джек Дуглас
источник
Когда временные таблицы удаляются, нужен ли им вакуум для очистки памяти или дисковых ресурсов? Я пытаюсь решить эту проблему и не уверен, что причиной утечки памяти является тот факт, что autovacuum не может видеть временные таблицы. Нужно ли вручную пылесосить?
шикарная
«Когда временные таблицы отбрасываются, нужен ли им вакуум» нет, смотрите здесь . То же самое верно для любых таблиц, не только временных таблиц.
Джек Дуглас
3

Я не знаю, может ли это помочь вам, но вы можете попробовать.

Следующий запрос таблицы системного каталога должен иметь возможность перечислить все временные таблицы, созданные в других сеансах в базе данных:

выберите pn.nspname, pc.relname из pg_class pc, pg_namespace pn, где pc.relnamespace = pn.oid и pc.relname или 'your_temp_table_name';

Согласно PostgreSQL doc , Temporary tables exist in a special schemaи обычно создаются с именем as pg_temp_xxx. Итак, используя schemaname. relationnameИсходя из вышеприведенного запроса, вы должны иметь возможность запросить вашу временную таблицу. Как вы можете видеть здесь, временная таблица ссылается на имя, дополненное схемой.

Пример: select * from pg_temp_20.your_temp_table_name

Gnanam
источник
1
Спасибо за чаевые. Мне удалось найти имя и схему для временной таблицы с помощью dbvis (который, вероятно, использует первый упомянутый вами запрос), но проблема заключалась в том, что я не смог получить к ним доступ из сеанса, отличного от того, в котором они были созданы.
Newenglander