ฉันจะแสดงรายการตารางทั้งหมดใน schemas ทั้งหมดที่เป็นของผู้ใช้ปัจจุบันใน Postgresql ได้อย่างไร


25

ฉันสามารถแสดงรายการตารางทั้งหมดในแบบแผนทั้งหมดที่ใช้

> \dt *.*

แต่นั่นยังแสดงรายการตารางระบบที่มีจำนวนมากกว่าตารางของฉันที่ฉันสนใจ ฉันต้องการตารางทั้งหมด (และอาจเป็นไปได้) ที่สร้างขึ้นโดยฉันในสคีมาสาธารณะและสคีมาใด ๆ ที่ฉันกำหนดไว้

ฉันหวังที่จะหาวิธีการทำเช่นนี้โดยไม่ต้องเพิ่ม schema ที่เส้นทางการค้นหาอย่างชัดเจนในขณะที่ฉันสร้างพวกเขาตามที่อธิบายไว้ที่นี่:

/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 จากสิ่งนี้
ปีเตอร์โกรฟส์

คำตอบที่ยอดเยี่ยมเพิ่ม a when 'm' then 'MATERIALIZED_VIEW'เพื่อแสดงประเภทใหม่
Forbesmyester

ในขณะที่คำตอบอื่นสั้นกระชับนี่อาจเกี่ยวข้องเมื่อไม่รวม namespaces
mlt


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.