Jak wyświetlić wszystkie tabele we wszystkich schematach należących do bieżącego użytkownika w Postgresql?

25

Mogę wyświetlić listę wszystkich tabel we wszystkich schematach, używając

> \dt *.*

ale zawiera również tabele systemowe, które znacznie przewyższają liczbę moich tabel, na których mi zależy. Chciałbym, aby wszystkie tabele (i ewentualnie widoki) zostały utworzone przeze mnie w schemacie publicznym i dowolnych schematach, które zdefiniowałem.

Mam nadzieję, że znajdę sposób, aby to zrobić bez konieczności jawnego dodawania schematów do ścieżki wyszukiwania podczas ich tworzenia, jak opisano tutaj:

/programming//a/12902069

EDYTOWAĆ:

Na podstawie zaakceptowanej odpowiedzi utworzyłem następujący widok:

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 teraz następujące polecenie daje mi to, czego chciałem:

select * from my_tables;
Peter Groves
źródło

Odpowiedzi:

32

Spowoduje to wyświetlenie wszystkich tabel, do których bieżący użytkownik ma dostęp, nie tylko tych, które są własnością bieżącego użytkownika:

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

(Nie jestem jednak do końca pewien, czy not like 'pg_toast%'jest to rzeczywiście potrzebne).

Naprawdę potrzebujesz informacji o właścicielu, prawdopodobnie musisz użyć pg_classpowiązanych tabel.

Edycja: jest to zapytanie zawierające informacje o właścicielu:

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;
koń bez imienia
źródło
To wystarczy. Z tego utworzę widok o nazwie moje_tabele.
Peter Groves,
Świetna odpowiedź, dodaj, when 'm' then 'MATERIALIZED_VIEW'aby pokazać ten nowy typ.
Forbesmyester
Chociaż inna odpowiedź jest zwięzła, może być istotna, gdy wyklucza się przestrzenie nazw.
mlt
18

Krótka odpowiedź na pytanie brzmiałaby:

SELECT *
FROM pg_tables t
WHERE t.tableowner = current_user;
Sahap Asci
źródło
-3

Zobacz. Wszystkie tabele:

SELECT relname FROM pg_class WHERE relname !~ '^(pg_|sql_)' AND relkind = 'r';
żeberka
źródło