Comment répertorier toutes les tables de tous les schémas appartenant à l'utilisateur actuel dans Postgresql?

25

Je peux lister toutes les tables dans tous les schémas en utilisant

> \dt *.*

mais cela répertorie également les tables système qui sont beaucoup plus nombreuses que mes tables qui me tiennent à cœur. J'aimerais toutes les tables (et éventuellement les vues) créées par moi dans le schéma public et tous les schémas que j'ai définis.

J'espère trouver un moyen de le faire sans avoir à ajouter explicitement des schémas au chemin de recherche lorsque je les crée, comme décrit ici:

/programming//a/12902069

MODIFIER:

Sur la base de la réponse acceptée, j'ai créé la vue suivante:

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

Et maintenant, la commande suivante me donne ce que je voulais:

select * from my_tables;
Peter Groves
la source

Réponses:

32

Cela répertoriera toutes les tables auxquelles l'utilisateur actuel a accès, pas seulement celles qui appartiennent à l'utilisateur actuel:

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

(Je ne suis pas tout à fait sûr que ce not like 'pg_toast%'soit vraiment nécessaire cependant.)

Si vous avez vraiment besoin des informations sur le propriétaire, vous avez probablement besoin d'utiliser pg_classdes tables et connexes.

Modifier: c'est la requête qui inclut les informations du propriétaire:

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;
un cheval sans nom
la source
C'est assez bien. Je vais créer une vue appelée my_tables à partir de cela.
Peter Groves
Excellente réponse, ajoutez un when 'm' then 'MATERIALIZED_VIEW'pour montrer ce nouveau type.
Forbesmyester
Bien qu'une autre réponse soit concise, cela peut être pertinent lors de l'exclusion des espaces de noms.
mlt
18

La réponse courte à la question serait:

SELECT *
FROM pg_tables t
WHERE t.tableowner = current_user;
Sahap Asci
la source
-3

Regarde ça. Toutes les tables:

SELECT relname FROM pg_class WHERE relname !~ '^(pg_|sql_)' AND relkind = 'r';
ribafs
la source