Làm cách nào để liệt kê tất cả các khung nhìn trong SQL trong PostgreSQL?


40

Làm cách nào để liệt kê tất cả các khung nhìn cho cơ sở dữ liệu bằng lệnh SQL trong PostgreQuery?

Tôi muốn một cái gì đó tương tự như đầu ra của \dvlệnh psql , nhưng tốt nhất chỉ là một danh sách các tên xem. ví dụ,

SELECT ...;
my_view_1
my_view_2
my_view_3

Tôi đang chạy PostgreSQL v9.1.4 trên Ubuntu Linux.


bạn có thể chọn một câu trả lời?
Evan Carroll

Câu trả lời:


42

Từ tài liệu :

 select table_name from INFORMATION_SCHEMA.views;

Nếu bạn không muốn lượt xem hệ thống là kết quả của mình, hãy thử điều này:

 select table_name from INFORMATION_SCHEMA.views WHERE table_schema = ANY (current_schemas(false))

Cảm ơn @Phil. Tuy nhiên, lệnh đó trả về 128 hàng, trong khi \ dv trả về 57 hàng. Nó dường như cũng mang lại cho tôi các chế độ xem hệ thống, như "bảng", "cột", "tên miền", "pg_role", v.v ... Làm cách nào để tôi có được các chế độ xem mà tôi đã tạo?
Rob Bednark

Nó cung cấp cho bạn một danh sách những người bạn có quyền truy cập. Để lấy các lược đồ cho một lược đồ nhất định, hãy thêm where table_schema='USERNAME'vào truy vấn
Phil

@phil Điều này chỉ hoạt động nếu có một lược đồ có tên giống hệt người dùng. Theo mặc định, đây không phải là trường hợp, tuy nhiên, có publiclược đồ.
dezso

1
Information_SCHema.view chỉ hiển thị các chế độ xem mà người dùng hiện tại có quyền. Nếu có các chế độ xem trong cơ sở dữ liệu mà người dùng hiện tại không có (các) quyền, thì tên của các chế độ xem đó sẽ không hiển thị trong kết quả. Từ tài liệu trong liên kết của @ Phil: Chỉ những quan điểm đó được hiển thị rằng người dùng hiện tại có quyền truy cập (bằng cách là chủ sở hữu hoặc có một số đặc quyền).
Cao Minh Từ

21

Bạn có thể truy vấn pg_catalog.pg_viewsthông tin mong muốn của bạn:

select viewname from pg_catalog.pg_views;

Truy vấn được tinh chỉnh để nhận tên lược đồ - chỉ trong trường hợp bạn có nhiều chế độ xem có cùng tên trong các lược đồ khác nhau - và bỏ qua các chế độ xem hệ thống đó:

select schemaname, viewname from pg_catalog.pg_views
where schemaname NOT IN ('pg_catalog', 'information_schema')
order by schemaname, viewname;

IMHO, cách này tốt hơn truy vấn Information_SCHema.view vì những lý do được nêu trong nhận xét của tôi đối với câu trả lời của Phil .


4

Nếu bạn chỉ cần điều này một cách tương tác khi ở trong psql, bạn cũng có thể sử dụng \dvđể hiển thị các chế độ xem hoặc \dmcho các chế độ xem được cụ thể hóa. Hoặc sử dụng với +, \dm+ví dụ như để hiển thị một số thông tin bổ sung (chủ yếu hữu ích để xem kích thước chế độ xem được cụ thể hóa).


1
\dv *.*\dm *.* cho những thông tin trên tất cả các lược đồ!
Pak

3

Thử:

SELECT  n.nspname AS table_schema,
        pg_catalog.pg_get_userbyid(c.relowner) AS table_owner,
        c.relname AS table_name
    FROM pg_catalog.pg_class c
         LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
    WHERE c.relkind  = 'v'
;

Nếu bạn muốn biết thêm chi tiết, bạn có thể sửa đổi những điều sau đây cho phù hợp với nhu cầu của bạn:

SELECT  n.nspname AS table_schema,
        pg_catalog.pg_get_userbyid(c.relowner) AS table_owner,
        c.relname AS table_name,
        s.n_live_tup AS row_count,
        count (a.attname) AS column_count,
        pg_catalog.obj_description(c.oid, 'pg_class') AS comments,
        CASE c.relkind
            WHEN 'v'
            THEN pg_catalog.pg_get_viewdef(c.oid, true)
            ELSE null
            END AS query
    FROM pg_catalog.pg_class c
         LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
         LEFT JOIN pg_catalog.pg_attribute a ON (c.oid = a.attrelid AND a.attnum > 0 AND NOT a.attisdropped)
         LEFT JOIN pg_catalog.pg_stat_all_tables s ON (c.oid = s.relid)
    WHERE c.relkind  = 'v'
GROUP BY n.nspname,
        c.relowner,
        c.relkind,
        c.relname,
        s.n_live_tup,
        c.oid
ORDER BY n.nspname,
        c.relname
;

2

Tôi đã tạo một viewdanh sách để liệt kê một danh mục views:

create or replace view show_views as 
select table_name from INFORMATION_SCHEMA.views 
WHERE table_schema = ANY (current_schemas(false));

Và khi tôi muốn xem tất cả các khung nhìn trong cơ sở dữ liệu, tôi viết:

select * from show_views;
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.