Postgresql'de mevcut kullanıcının sahibi olduğu tüm şemalardaki tüm tabloları nasıl listeleyebilirim?


25

Tüm şemalardaki tüm tabloları kullanarak

> \dt *.*

ama aynı zamanda umrumda olan masalarımdan çok daha fazla olan sistem tablolarını listeler. Kamu şemasında ve tanımladığım tüm şemalarda tarafımdan oluşturulan tüm tabloları (ve muhtemelen görünümleri) istiyorum.

Bunları burada açıklandığı gibi oluştururken arama yoluna açıkça şemalar eklemek zorunda kalmadan bunu yapmanın bir yolunu bulmayı umuyorum:

/programming//a/12902069

DÜZENLE:

Kabul edilen cevaba göre, aşağıdaki Görünümü oluşturdum:

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

Ve şimdi aşağıdaki komut bana istediğimi veriyor:

select * from my_tables;

Yanıtlar:


32

Bu, yalnızca geçerli kullanıcının sahip olduğu tabloları değil, geçerli kullanıcının erişebildiği tüm tabloları listeler:

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

(Gerçekte not like 'pg_toast%'gerçekte gerekli olduğundan tam olarak emin değilim .)

Gerçekten sahiplik bilgilerine ihtiyacım var, muhtemelen kullanmanız pg_classve ilgili tablolar gerekir.

Düzenleme: Bu, sahip bilgilerini içeren sorgudur:

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;

Bu yeterince iyi. Bundan my_tables adında bir Görünüm oluşturacağım.
Peter Groves

Harika cevap, when 'm' then 'MATERIALIZED_VIEW'bu yeni türü göstermek için bir ekleyin .
Forbesmyester

Başka bir cevap özlü olmakla birlikte, ad alanları hariç tutulduğunda bu geçerli olabilir .
mlt

18

Sorunun kısa cevabı şöyle olacaktır:

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

-3

Bunu gör. Tüm masalar:

SELECT relname FROM pg_class WHERE relname !~ '^(pg_|sql_)' AND relkind = 'r';
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.