PostgreSQL'de SQL'deki tüm görünümler nasıl listelenir?


40

PostgreSQL'de bir SQL komutu kullanarak bir veritabanı için tüm görünümleri nasıl listeleyebilirim?

Psql \dvkomutunun çıktısına benzer bir şey istiyorum , ancak tercihen yalnızca görünüm adları listesi istiyorum. Örneğin,

SELECT ...;
my_view_1
my_view_2
my_view_3

Ubuntu Linux'ta PostgreSQL v9.1.4 kullanıyorum.


bir cevap seçebilir misin
Evan Carroll,

Yanıtlar:


42

Gönderen belgeler :

 select table_name from INFORMATION_SCHEMA.views;

Sistem görünümlerinin sizin sonucunuz olmasını istemiyorsanız, şunu deneyin:

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

@ Phil teşekkürler. Ancak, bu komut 128 satır verir, oysa \ dv 57 satır döndürür. Bana "tablolar", "sütunlar", "alan adları", "pg_role" vb. Gibi sistem görünümleri de veriyor gibi görünüyor.
Rob Bednark

Size erişebildiğinizlerin bir listesini verir. Belirli bir şema için olanları almak where table_schema='USERNAME'için, sorguya ekleyin
Philᵀᴹ

@ phil Bu, yalnızca kullanıcıya özdeş olarak adlandırılmış bir şema varsa çalışır. Varsayılan olarak bu durum böyle değildir, ancak publicşema var.
dezso

1
INFORMATION_SCHEMA.views, mevcut kullanıcının üzerinde hak sahibi olduğu görünümleri gösterir. Veritabanında mevcut kullanıcının üzerinde hak sahibi olmadığı görünümler varsa, bu görünümlerin adı sonuçta gösterilmez. @ Phil'in bağlantısındaki belgede: Yalnızca mevcut kullanıcının erişebileceği (sahip olma veya bazı ayrıcalıklara sahip olma) erişimi olduğu görülmüştür.
Cao Minh Tu

21

pg_catalog.pg_viewsİstediğiniz bilgileri sorgulayabilirsiniz :

select viewname from pg_catalog.pg_views;

Şema adını almak için rafine edilmiş sorgu da - farklı şemalarda aynı ada sahip birden fazla görünümün olması durumunda - ve bu sistem görünümlerini dışarıda bıraktı:

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

IMHO, bu şekilde benim belirtilen nedenlerle sorgu INFORMATION_SCHEMA.views daha iyidir yorumun için Phil cevap .


4

Buna sadece içindeyken etkileşimli olarak ihtiyaç duyuyorsanız psql, \dvgörünümleri göstermek veya \dmmateryalize görünümler için de kullanabilirsiniz . Ya da +, \dm+örneğin bazı ek bilgiler göstermek için olduğu gibi kullanın (çoğunlukla gerçekleştirilmiş görünüm boyutunu görmek için kullanışlıdır).


1
\dv *.*ve \dm *.* tüm şemalardaki bu bilgiler için!
Pak,

3

Deneyin:

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

Daha fazla ayrıntı istiyorsanız, gereksinimlerinize uyacak şekilde aşağıdakileri değiştirebilirsiniz:

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

viewBir kataloğu listelemek için bir tane hazırladım views:

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

Ve veritabanındaki tüm görünümleri görmek istediğimde yazarım:

select * from show_views;
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.