Làm cách nào để liệt kê tất cả các bảng trong tất cả các lược đồ thuộc sở hữu của người dùng hiện tại trong Postgresql?


25

Tôi có thể liệt kê tất cả các bảng trong tất cả các lược đồ bằng cách sử dụng

> \dt *.*

nhưng điều đó cũng liệt kê các bảng hệ thống vượt xa các bảng mà tôi quan tâm. Tôi muốn tất cả các bảng (và có thể là các khung nhìn) do tôi tạo trong lược đồ công cộng và bất kỳ lược đồ nào tôi đã xác định.

Tôi hy vọng tìm ra cách để làm điều này mà không cần phải thêm rõ ràng các lược đồ vào đường dẫn tìm kiếm khi tôi tạo chúng như được mô tả ở đây:

/programming//a/12902069

CHỈNH SỬA:

Dựa trên câu trả lời được chấp nhận, tôi đã tạo Chế độ xem sau:

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

Và bây giờ lệnh sau cho tôi những gì tôi muốn:

select * from my_tables;

Câu trả lời:


32

Điều này sẽ liệt kê tất cả các bảng mà người dùng hiện tại có quyền truy cập, không chỉ những bảng thuộc sở hữu của người dùng hiện tại:

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

(Tôi không hoàn toàn chắc chắn not like 'pg_toast%'là thực sự cần thiết mặc dù.)

Tôi thực sự cần thông tin chủ sở hữu, có lẽ bạn cần sử dụng pg_classvà các bảng liên quan.

Chỉnh sửa: đây là truy vấn bao gồm thông tin chủ sở hữu:

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;

Điều này là đủ tốt. Tôi sẽ tạo một Chế độ xem được gọi là my_tables từ đây.
Peter Groves

Câu trả lời tuyệt vời, thêm một when 'm' then 'MATERIALIZED_VIEW'để hiển thị loại mới.
Forbesmyester

Trong khi câu trả lời khác ngắn gọn, điều này có thể có liên quan khi loại trừ không gian tên.
mlt

18

Câu trả lời ngắn cho câu hỏi sẽ là:

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

-3

Xem cái này Tất cả các bảng:

SELECT relname FROM pg_class WHERE relname !~ '^(pg_|sql_)' AND relkind = 'r';
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.