Bagaimana cara mendaftar semua tabel di semua skema yang dimiliki oleh pengguna saat ini di Postgresql?


25

Saya bisa daftar semua tabel di semua skema menggunakan

> \dt *.*

tetapi itu juga mencantumkan tabel sistem yang jauh melebihi jumlah tabel saya yang saya pedulikan. Saya ingin semua tabel (dan mungkin tampilan) dibuat oleh saya dalam skema publik dan skema apa pun yang telah saya tetapkan.

Saya berharap menemukan cara untuk melakukan ini tanpa harus secara eksplisit menambahkan skema ke jalur pencarian saat saya membuatnya seperti yang dijelaskan di sini:

/programming//a/12902069

EDIT:

Berdasarkan jawaban yang diterima, saya telah membuat Tampilan berikut:

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

Dan sekarang perintah berikut memberi saya apa yang saya inginkan:

select * from my_tables;

Jawaban:


32

Ini akan mencantumkan semua tabel yang dapat diakses oleh pengguna saat ini, tidak hanya yang dimiliki oleh pengguna saat ini:

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

(Aku tidak sepenuhnya yakin not like 'pg_toast%'itu benar-benar dibutuhkan.)

Jika Anda benar-benar membutuhkan informasi pemilik, Anda mungkin perlu menggunakan pg_classdan tabel terkait.

Sunting: ini adalah kueri yang menyertakan informasi pemilik:

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;

Ini cukup bagus. Saya akan membuat tampilan yang disebut my_tables dari ini.
Peter Groves

Jawaban bagus, tambahkan when 'm' then 'MATERIALIZED_VIEW'untuk menunjukkan tipe baru itu.
Forbesmyester

Sementara jawaban lain singkat, ini mungkin relevan ketika mengecualikan ruang nama.
mlt

18

Jawaban singkat untuk pertanyaan itu adalah:

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

-3

Lihat ini. Semua tabel:

SELECT relname FROM pg_class WHERE relname !~ '^(pg_|sql_)' AND relkind = 'r';
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.