Jak wyświetlić listę wszystkich widoków w SQL w PostgreSQL?

40

Jak wyświetlić listę wszystkich widoków bazy danych za pomocą polecenia SQL w PostgreSQL?

Chciałbym coś podobnego do wyniku \dvpolecenia psql , ale najlepiej tylko listę nazw widoków. na przykład,

SELECT ...;
my_view_1
my_view_2
my_view_3

Używam PostgreSQL v9.1.4 na Ubuntu Linux.

Rob Bednark
źródło
czy możesz wybrać odpowiedź?
Evan Carroll,

Odpowiedzi:

42

Z dokumentacji :

 select table_name from INFORMATION_SCHEMA.views;

Jeśli nie chcesz, aby widoki systemu były Twoim wynikiem, spróbuj tego:

 select table_name from INFORMATION_SCHEMA.views WHERE table_schema = ANY (current_schemas(false))
Philᵀᴹ
źródło
Dzięki @Phil. Jednak polecenie to zwraca 128 wierszy, a \ dv zwraca 57 wierszy. Wygląda na to, że daje mi także widoki systemowe, takie jak „tabele”, „kolumny”, „domeny”, „pg_role” itp. Jak uzyskać tylko te widoki, które utworzyłem?
Rob Bednark,
Daje ci listę tych, do których masz dostęp. Aby uzyskać je dla danego schematu, dodaj where table_schema='USERNAME'do zapytania
Philᵀᴹ
@phil Działa to tylko wtedy, gdy istnieje schemat o nazwie identycznej dla użytkownika. Domyślnie tak nie jest, istnieje jednak publicschemat.
dezso,
1
INFORMACJE_SCHEMA.Widoki pokazują tylko widoki, do których bieżący użytkownik ma uprawnienia. Jeśli w bazie danych są widoki, do których bieżący użytkownik nie ma uprawnień, nazwa tych widoków nie pojawi się w wyniku. Z dokumentu w łączu @ Phila: pokazane są tylko te widoki, do których bieżący użytkownik ma dostęp (poprzez bycie właścicielem lub posiadanie pewnych uprawnień).
Cao Minh Tu
21

Możesz zapytać pg_catalog.pg_viewso pożądane informacje:

select viewname from pg_catalog.pg_views;

Udoskonalone zapytanie, aby uzyskać także nazwę schematu - na wypadek, gdybyś miał wiele widoków o tej samej nazwie w różnych schematach - i pominął te widoki systemu:

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

IMHO, ten sposób jest lepszy niż przeglądanie informacji INFORMACJE_SCHEMA. z powodów podanych w moim komentarzu do odpowiedzi Phila .

Cao Minh Tu
źródło
4

Jeśli potrzebujesz tego tylko interaktywnie psql, możesz także użyć \dvdo wyświetlenia widoków lub \dmwidoków zmaterializowanych. Lub użyj z +, \dm+na przykład, aby wyświetlić dodatkowe informacje (najczęściej przydatne, aby zobaczyć zmaterializowany rozmiar widoku).

Timur
źródło
1
\dv *.*i \dm *.* dla tych informacji na temat wszystkich schematów!
Pak
3

Próbować:

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

Jeśli chcesz uzyskać więcej szczegółów, możesz zmodyfikować następujące elementy w zależności od potrzeb:

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
;
gsiems
źródło
2

Stworzyłem, viewaby wyświetlić katalog views:

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

A kiedy chcę zobaczyć wszystkie widoki w bazie danych, piszę:

select * from show_views;
omar
źródło