Bagaimana daftar semua tampilan dalam SQL di PostgreSQL?


42

Bagaimana cara membuat daftar semua tampilan untuk database menggunakan perintah SQL di PostgreSQL?

Saya ingin sesuatu yang mirip dengan output dari \dvperintah psql , tetapi lebih disukai hanya daftar nama tampilan. misalnya,

SELECT ...;
my_view_1
my_view_2
my_view_3

Saya menjalankan PostgreSQL v9.1.4 di Ubuntu Linux.

Jawaban:


44

Dari dokumentasi :

 select table_name from INFORMATION_SCHEMA.views;

Jika Anda tidak ingin tampilan sistem adalah hasil Anda, coba ini:

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

Terima kasih @Phil. Namun, perintah itu mengembalikan 128 baris, sedangkan \ dv mengembalikan 57 baris. Tampaknya memberi saya pandangan sistem juga, seperti "tabel", "kolom", "domain", "pg_role", dll. Bagaimana cara mendapatkan hanya pandangan yang saya buat?
Rob Bednark

Ini memberi Anda daftar yang Anda punya akses. Untuk mendapatkan skema tertentu, tambahkan where table_schema='USERNAME'ke kueri
Philᵀᴹ

@ phil Ini hanya berfungsi jika ada skema yang namanya identik dengan pengguna. Secara default, ini bukan masalahnya, namun ada publicskema.
dezso

1
INFORMATION_SCHEMA.views hanya menunjukkan tampilan yang hak pengguna saat ini aktif. Jika ada tampilan dalam database yang tidak dimiliki hak pengguna saat ini, nama tampilan tersebut tidak akan ditampilkan di hasilnya. Dari dokumen di tautan @ Phil: Hanya pandangan yang diperlihatkan bahwa pengguna saat ini memiliki akses ke (dengan cara menjadi pemilik atau memiliki hak istimewa).
Cao Minh Tu

21

Anda dapat menanyakan pg_catalog.pg_viewsinformasi yang Anda inginkan:

select viewname from pg_catalog.pg_views;

Permintaan yang disempurnakan untuk mendapatkan nama skema juga - kalau-kalau Anda memiliki beberapa tampilan dengan nama yang sama di skema yang berbeda - dan meninggalkan tampilan sistem tersebut:

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

IMHO, cara ini lebih baik daripada permintaan INFORMATION_SCHEMA.lihat alasan yang tercantum dalam komentar saya untuk jawaban Phil .


4

Jika Anda hanya membutuhkan ini secara interaktif saat di dalam psql, Anda juga dapat menggunakan \dvuntuk menampilkan tampilan, atau \dmuntuk tampilan terwujud. Atau gunakan dengan +, seperti \dm+misalnya untuk menunjukkan beberapa informasi tambahan (sebagian besar berguna untuk melihat ukuran tampilan terwujud).


1
\dv *.*dan \dm *.* untuk informasi tentang semua skema!
Pak

3

Mencoba:

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

Jika Anda ingin lebih detail, Anda dapat memodifikasi yang berikut ini sesuai dengan kebutuhan Anda:

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

Saya membuat viewdaftar katalog views:

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

Dan ketika saya ingin melihat semua tampilan dalam database saya menulis:

select * from show_views;

0

Berikut adalah kueri yang akan memunculkan tampilan terwujud Anda juga dan menunjukkan kepada Anda dependensi tampilan.

-- Get a list of views that have dependencies on other views
with view_oids as (
    select
        distinct(dependent_view.oid) as view_oid

    from pg_depend
    JOIN pg_rewrite ON pg_depend.objid = pg_rewrite.oid
    JOIN pg_class as dependent_view ON pg_rewrite.ev_class = dependent_view.oid
    JOIN pg_namespace dependent_ns ON dependent_ns.oid = dependent_view.relnamespace
    WHERE
    dependent_ns.nspname = 'public'
), view_dependencies as (
    select
        dependent_view.oid as dependent_oid,
        dependent_ns.nspname as dependent_schema,
        dependent_view.relname as dependent_view,
        source_table.oid as dependency_oid,
        source_ns.nspname as source_schema,
        source_table.relname as source_view
    from pg_depend
    JOIN pg_rewrite ON pg_depend.objid = pg_rewrite.oid
    JOIN pg_class as dependent_view ON pg_rewrite.ev_class = dependent_view.oid
    JOIN pg_class as source_table ON pg_depend.refobjid = source_table.oid
    JOIN view_oids on source_table.oid = view_oids.view_oid
    JOIN pg_namespace dependent_ns ON dependent_ns.oid = dependent_view.relnamespace
    JOIN pg_namespace source_ns ON source_ns.oid = source_table.relnamespace
    WHERE
        source_ns.nspname = 'public'
    group by
        dependent_view.oid,
        dependent_ns.nspname,
        dependent_view.relname,
        source_table.oid,
        source_ns.nspname,
        source_table.relname
)
select 
    view_dependencies.*
from view_dependencies
;
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.