Як перерахувати всі таблиці у всіх схемах, що належать поточному користувачеві в 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;

Це досить добре. Я збираюся створити з цього виду my_tables.
Пітер Гроув

Чудова відповідь, додайте, when 'm' then 'MATERIALIZED_VIEW'щоб показати цей новий тип.
Forbesmyester

Хоча інша відповідь є лаконічною, це може бути актуальним при виключенні просторів імен.
мільйон


-3

Дивіться це. Усі таблиці:

SELECT relname FROM pg_class WHERE relname !~ '^(pg_|sql_)' AND relkind = 'r';
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.