Как перечислить все представления в SQL в PostgreSQL?


42

Как мне перечислить все представления для базы данных, используя команду SQL в PostgreSQL?

Я хотел бы что-то похожее на вывод команды psql \dv, но желательно просто список имен представлений. например,

SELECT ...;
my_view_1
my_view_2
my_view_3

Я использую PostgreSQL v9.1.4 в Ubuntu Linux.

Ответы:


44

Из документации :

 select table_name from INFORMATION_SCHEMA.views;

Если вы не хотите, чтобы системные представления были вашим результатом, попробуйте следующее:

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

Спасибо @Phil. Однако эта команда возвращает 128 строк, тогда как \ dv возвращает 57 строк. Кажется, он также дает мне системные представления, такие как "таблицы", "столбцы", "домены", "pg_role" и т. Д. Как получить только те представления, которые я создал?
Роб Беднарк

Это дает вам список тех, к которым у вас есть доступ. Чтобы получить их для данной схемы, добавьте where table_schema='USERNAME'к запросу
Philᵀᴹ

@phil Это работает, только если есть схема, названная идентично пользователю. По умолчанию это не так, однако есть publicсхема.
Дезсо

1
INFORMATION_SCHEMA.views просто показывает представления, на которые имеет право текущий пользователь. Если в базе данных есть представления, на которые у текущего пользователя нет прав, то имя этих представлений не будет отображаться в результате. Из документа по ссылке @ Phil: только те представления, к которым у текущего пользователя есть доступ (в силу того, что он является владельцем или имеет некоторые привилегии).
Цао Минь

21

Вы можете запросить pg_catalog.pg_viewsнеобходимую информацию:

select viewname from pg_catalog.pg_views;

Уточненный запрос, чтобы также получить имя схемы - на случай, если у вас есть несколько представлений с одним и тем же именем в разных схемах - и пропустить эти системные представления:

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

ИМХО, этот способ лучше, чем запрос INFORMATION_SCHEMA.views по причинам, изложенным в моем комментарии к ответу Фила .


4

Если вам это нужно только в интерактивном режиме psql, вы также можете использовать его \dvдля отображения представлений или \dmдля материализованных представлений. Или используйте +, как, \dm+например, чтобы показать некоторую дополнительную информацию (в основном полезно, чтобы увидеть материализованный размер представления).


1
\dv *.*и \dm *.* для этой информации на всех схемах!
Пак

3

Пытаться:

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

Если вам нужна более подробная информация, вы можете изменить следующее в соответствии с вашими потребностями:

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

Я создал viewсписок каталогов views:

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

И когда я хочу увидеть все представления в базе данных, я пишу:

select * from show_views;

0

Вот запрос, который также выведет ваши материализованные представления и покажет вам зависимости представлений.

-- 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
;
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.