Чи є спосіб отримати доступ до тимчасових таблиць інших сеансів у postgres?


17

Я працюю з додатком Windows, який використовує (локальну) базу даних Postgres і зберігає деяку інформацію у тимчасовій таблиці. Я хотів би подивитися на тимчасову таблицю, але pgadmin та dbVis говорять мені: ERROR: cannot access temporary tables of other sessionsколи я намагаюся запитувати дані. Я спробував змінити дозволи дозволу на схему та таблицю, але це, здається, не допомогло, хоча я отримую доступ до бази даних з тим самим користувачем, що і сама програма (принаймні в dbVis). Чи є в моїй базі даних параметр, який я можу змінити, що дозволяє мені мати доступ "root" до всіх сеансів у моїй базі даних?

Відповіді:


14

Відсутність доступу до тимчасових таблиць на інших сесіях не є питанням дозволів, це технічне обмеження дизайну. Позашляховий модуль PostgreSQL не може отримати доступ до тимчасових таблиць іншого бекенда, оскільки для тимчасових таблиць не робиться жодна звичайна ведення господарства, що дозволяє одночасний доступ.

У 9.2 UNLOGGEDзамість цього ви хочете використовувати таблицю; це може бути видно з інших сеансів, але зберігає більшість переваг ефективності тимчасової таблиці.


11

Коротка відповідь - «Ні». Тимчасові таблиці в інших сесіях невидимі за дизайном. Не має значення, якщо два сеанси мають одного користувача. Навіть:

Демон демонстрації автовакууму не може отримати доступ і тому не може вакуумувати або аналізувати тимчасові таблиці


Коли скидаються темп-таблиці, чи потрібен їм вакуум для збирання будь-яких ресурсів пам'яті чи диска? Я намагаюся вирішити цю проблему, і не впевнений, чи цей факт, що autovacuum не бачить тимчасові таблиці, є причиною витоку пам'яті. Чи потрібно вручну пилососити?
найвищий

"Коли темп-таблиці скидаються, чи потрібен їм вакуум" ні, дивіться тут . Те саме стосується будь-яких таблиць, а не лише тимчасових таблиць.
Джек Дуглас

3

Я не знаю, чи це може вам допомогти, але ви можете спробувати.

Наступний запит таблиці системного каталогу повинен мати можливість перелічити всі тимчасові таблиці, створені в інших сесіях у базі даних:

виберіть pn.nspname, pc.relname з pg_class pc, pg_namespace pn, де pc.relnamespace = pn.oid та pc.relname ilike 'your_temp_table_name';

За PostgreSQL документ , Temporary tables exist in a special schemaі, як правило , створюється з ім'ям pg_temp_xxx. Отже, використовуючи schemaname. relationnameЗверху запит, ви повинні мати можливість запитувати вашу тимчасову таблицю. Як ви бачите тут, на тимчасову таблицю посилається ім'я, відповідне схемою.

Приклад: select * from pg_temp_20.your_temp_table_name


1
Дякую за пораду. Мені вдалося дізнатись ім'я та схему тимчасової таблиці за допомогою dbvis (який, ймовірно, використовує перший запит, який ви згадали), але проблема полягала в тому, що я не міг отримати доступ до них із сеансу, відмінного від того, в якому вони були створені.
newenglander
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.