Как мне перечислить все таблицы во всех схемах, принадлежащих текущему пользователю в Postgresql?

25

Я могу перечислить все таблицы во всех схемах, используя

> \dt *.*

но в нем также перечислены системные таблицы, которые намного превосходят мои таблицы, которые меня интересуют. Я хотел бы, чтобы все таблицы (и, возможно, представления), созданные мной, в общедоступной схеме и любые схемы, которые я определил.

Я надеюсь найти способ сделать это без необходимости явно добавлять схемы в путь поиска, когда я создаю их, как описано здесь:

/programming//a/12902069

РЕДАКТИРОВАТЬ:

Основываясь на принятом ответе, я создал следующее представление:

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

И теперь следующая команда дает мне то, что я хотел:

select * from my_tables;
Питер Гровс
источник

Ответы:

32

Это перечислит все таблицы, к которым имеет доступ текущий пользователь, а не только те, которые принадлежат текущему пользователю:

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

(Я не совсем уверен, что not like 'pg_toast%'это действительно нужно.)

Если вам действительно нужна информация о владельце, вам, вероятно, нужно использовать pg_classи соответствующие таблицы.

Изменить: это запрос, который включает в себя информацию о владельце:

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;
a_horse_with_no_name
источник
Это достаточно хорошо. Я собираюсь создать представление с именем my_tables из этого.
Питер Гроувс
Отличный ответ, добавьте, when 'm' then 'MATERIALIZED_VIEW'чтобы показать этот новый тип.
Forbesmyester
Хотя другой ответ является кратким, это может быть актуально при исключении пространств имен.
MLT
18

Краткий ответ на вопрос будет таким:

SELECT *
FROM pg_tables t
WHERE t.tableowner = current_user;
Сахап Аски
источник
-3

Посмотри это. Все таблицы:

SELECT relname FROM pg_class WHERE relname !~ '^(pg_|sql_)' AND relkind = 'r';
ribafs
источник