Come posso elencare tutte le tabelle in tutti gli schemi di proprietà dell'utente corrente in Postgresql?


25

Posso elencare tutte le tabelle in tutti gli schemi usando

> \dt *.*

ma questo elenca anche le tabelle di sistema che superano notevolmente le mie tabelle a cui tengo. Vorrei tutte le tabelle (e possibilmente le viste) create da me nello schema pubblico e tutti gli schemi che ho definito.

Spero di trovare un modo per farlo senza dover aggiungere esplicitamente schemi al percorso di ricerca mentre li creo come descritto qui:

/programming//a/12902069

MODIFICARE:

Sulla base della risposta accettata, ho creato la seguente vista:

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');

E ora il seguente comando mi dà quello che volevo:

select * from my_tables;

Risposte:


32

Questo elencherà tutte le tabelle a cui l'utente corrente ha accesso, non solo quelle di proprietà dell'utente corrente:

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

(Non sono del tutto sicuro che not like 'pg_toast%'sia effettivamente necessario però.)

Se hai davvero bisogno delle informazioni sul proprietario, probabilmente devi usare pg_classe le relative tabelle.

Modifica: questa è la query che include le informazioni sul proprietario:

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;

Questo è abbastanza buono. Da questo creerò una vista chiamata my_tables.
Peter Groves,

Ottima risposta, aggiungi a when 'm' then 'MATERIALIZED_VIEW'per mostrare quel nuovo tipo.
Forbesmyester,

Mentre un'altra risposta è concisa, ciò potrebbe essere rilevante quando si escludono gli spazi dei nomi.
mlt

18

La risposta breve alla domanda sarebbe:

SELECT *
FROM pg_tables t
WHERE t.tableowner = current_user;

-3

Guarda questo. Tutti i tavoli:

SELECT relname FROM pg_class WHERE relname !~ '^(pg_|sql_)' AND relkind = 'r';
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.