it-swarm-eu.dev

Jak mohu uvést všechny tabulky ve všech schématech vlastněných aktuálním uživatelem v Postgresql?

Pomocí tabulky mohu zobrazit všechny tabulky ve všech schématech

> \dt *.*

ale to také uvádí systémové tabulky, které výrazně převyšují mé tabulky, o které mi záleží. Chtěl bych, aby všechny tabulky (a možná i zobrazení) vytvořené mnou ve veřejném schématu a všechna schémata, která jsem definoval.

Doufám, že najdu způsob, jak toho dosáhnout, aniž bych musel explicitně přidávat schémata do vyhledávací cesty, když je vytvářím, jak je popsáno zde:

https://stackoverflow.com/a/12902069

UPRAVIT:

Na základě přijaté odpovědi jsem vytvořil následující pohled:

create view my_tables as 
select table_catalog, table_schema, table_name, table_type 
from information_schema.tables 
where table_schema not in ('pg_catalog', 'information_schema');

A nyní mi následující příkaz dává, co jsem chtěl:

select * from my_tables;
25
Peter Groves

Zobrazí se seznam všech tabulek, ke kterým má aktuální uživatel přístup, nejen těch, které vlastní aktuální uživatel:

select *
from information_schema.tables
where table_schema not in ('pg_catalog', 'information_schema')
and table_schema not like 'pg_toast%'

(Nejsem si zcela jistý, že not like 'pg_toast%' je však skutečně potřeba.)

Opravdu potřebujete informace o vlastníkovi, pravděpodobně budete muset použít pg_class a související tabulky.

Upravit: Toto je dotaz, který obsahuje informace o vlastníkovi:

select nsp.nspname as object_schema,
       cls.relname as object_name, 
       rol.rolname as owner, 
       case cls.relkind
         when 'r' then 'TABLE'
         when 'm' then 'MATERIALIZED_VIEW'
         when 'i' then 'INDEX'
         when 'S' then 'SEQUENCE'
         when 'v' then 'VIEW'
         when 'c' then 'TYPE'
         else cls.relkind::text
       end as object_type
from pg_class cls
  join pg_roles rol on rol.oid = cls.relowner
  join pg_namespace nsp on nsp.oid = cls.relnamespace
where nsp.nspname not in ('information_schema', 'pg_catalog')
  and nsp.nspname not like 'pg_toast%'
  and rol.rolname = current_user  --- remove this if you want to see all objects
order by nsp.nspname, cls.relname;
34

Krátká odpověď na otázku by byla:

SELECT *
FROM pg_tables t
WHERE t.tableowner = current_user;
20
Sahap Asci