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:
https://stackoverflow.com/a/12902069
ÉDITER:
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;
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 le not like 'pg_toast%'
est cependant nécessaire.)
Si vous avez vraiment besoin des informations sur le propriétaire, vous devez probablement utiliser pg_class
et tableaux associés.
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;
La réponse courte à la question serait:
SELECT *
FROM pg_tables t
WHERE t.tableowner = current_user;