Como listar todas as tabelas em todos os esquemas pertencentes ao usuário atual no Postgresql?


25

Eu posso listar todas as tabelas em todos os esquemas usando

> \dt *.*

mas isso também lista as tabelas do sistema que superam em muito as minhas tabelas com as quais me preocupo. Gostaria de todas as tabelas (e possivelmente visualizações) criadas por mim no esquema público e em todos os esquemas que defini.

Espero encontrar uma maneira de fazer isso sem ter que adicionar explicitamente esquemas ao caminho de pesquisa enquanto os crio, conforme descrito aqui:

/programming//a/12902069

EDITAR:

Com base na resposta aceita, criei a seguinte Visualização:

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 agora o seguinte comando me dá o que eu queria:

select * from my_tables;

Respostas:


32

Isso listará todas as tabelas às quais o usuário atual tem acesso, não apenas as que pertencem ao usuário atual:

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

(Não tenho muita certeza de que isso not like 'pg_toast%'seja realmente necessário.)

Eu realmente preciso das informações do proprietário, você provavelmente precisará usar pg_classe tabelas relacionadas.

Editar: esta é a consulta que inclui as informações do proprietário:

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;

Isso é bom o suficiente. Vou criar uma View chamada my_tables a partir disso.
Peter Groves

Ótima resposta, adicione a when 'm' then 'MATERIALIZED_VIEW'para mostrar esse novo tipo.
Forbesmyester

Embora outra resposta seja concisa, isso pode ser relevante ao excluir espaços para nome.
mlt 9/02

18

A resposta curta para a pergunta seria:

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

-3

Veja isso. Todas as tabelas:

SELECT relname FROM pg_class WHERE relname !~ '^(pg_|sql_)' AND relkind = 'r';
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.