it-swarm-eu.dev

Existuje způsob, jak získat přístup k dočasným tabulkám jiných relací v postgresu?

Pracuji s aplikací Windows, která používá (lokální) postgresovou databázi a ukládá některé informace do dočasné tabulky. Chtěl bych se podívat na dočasnou tabulku, ale pgadmin a dbVis mi řeknou: ERROR: cannot access temporary tables of other sessions při pokusu o dotaz na data. Snažil jsem se změnit oprávnění schématu a tabulky, ale zdálo se, že to nepomohlo, přestože přistupuji k databázi se stejným uživatelem jako samotný program (alespoň v dbVis). Existuje nastavení, které mohu změnit v mé databázi, které mi umožňuje mít „root“ přístup ke všem relacím v mé databázi?

19
newenglander

Nedostatek přístupu k dočasným tabulkám v jiných relacích není otázkou oprávnění, je to technické omezení designu. BackgreSQL backend nemůže přistupovat k dočasným tabulkám jiného backendu, protože u dočasných tabulek se neprovádí žádný z obvyklých hospodaření, který umožňuje souběžný přístup.

V 9.2 budete chtít místo toho použít tabulku UNLOGGED; to lze vidět z jiných relací, ale zachová se většina výhod výkonu dočasné tabulky.

15
Craig Ringer

Krátká odpověď zní „Ne“. Dočasné tabulky v jiných relacích jsou neviditelné záměrně. Nezáleží na tom, zda mají dvě relace stejného uživatele. Dokonce:

Démon autovacuum nemá přístup, a proto nemůže vysát ani analyzovat dočasné tabulky

Nevím, jestli vám to může pomoci, ale můžete to zkusit.

Následující dotaz tabulky systémového katalogu by měl být schopen zobrazit seznam všech dočasných tabulek vytvořených v jiných relacích v databázi:

vyberte pn.nspname, pc.relname z pg_class pc, pg_namespace pn kde pc.relnamespace = pn.oid a pc.relname ilike 'your_temp_table_name';

Za PostgreSQL doc , Temporary tables exist in a special schema a obvykle se vytvářejí se jménem jako pg_temp_xxx. Takže pomocí schemaname.relationname z výše uvedeného dotazu byste měli mít možnost dotazovat vaši dočasnou tabulku. Jak můžete vidět zde, na dočasnou tabulku se odkazuje s názvem kvalifikovaným podle schématu.

Příklad: select * from pg_temp_20.your_temp_table_name

3
Gnanam