¿Cómo enumero todas las tablas en todos los esquemas que posee el usuario actual en Postgresql?


25

Puedo enumerar todas las tablas en todos los esquemas usando

> \dt *.*

pero eso también enumera las tablas del sistema que superan en gran medida a mis tablas que me interesan. Me gustaría todas las tablas (y posiblemente las vistas) creadas por mí en el esquema público y cualquier esquema que haya definido.

Espero encontrar una manera de hacer esto sin tener que agregar esquemas explícitamente a la ruta de búsqueda a medida que los creo como se describe aquí:

/programming//a/12902069

EDITAR:

Según la respuesta aceptada, he creado la siguiente 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');

Y ahora el siguiente comando me da lo que quería:

select * from my_tables;

Respuestas:


32

Esto mostrará una lista de todas las tablas a las que tiene acceso el usuario actual, no solo aquellas que son propiedad del usuario actual:

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

(Sin not like 'pg_toast%'embargo, no estoy completamente seguro de que realmente sea necesario).

Si realmente necesita la información del propietario, probablemente necesite usar pg_classtablas relacionadas.

Editar: esta es la consulta que incluye la información del propietario:

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;

Esto es lo suficientemente bueno. Voy a crear una vista llamada my_tables a partir de esto.
Peter Groves

Gran respuesta, agregue un when 'm' then 'MATERIALIZED_VIEW'para mostrar ese nuevo tipo.
Forbesmyester

Si bien otra respuesta es concisa, esto podría ser relevante al excluir espacios de nombres.
mlt

18

La respuesta corta a la pregunta sería:

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

-3

Mira esto. Todas las mesas:

SELECT relname FROM pg_class WHERE relname !~ '^(pg_|sql_)' AND relkind = 'r';
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.