Як перелічити всі перегляди у SQL у PostgreSQL?


40

Як перерахувати всі перегляди бази даних за допомогою команди SQL в PostgreSQL?

Я хотів би щось подібне до виводу команди psql \dv, але бажано просто список імен перегляду. наприклад,

SELECT ...;
my_view_1
my_view_2
my_view_3

Я запускаю PostgreSQL v9.1.4 на Ubuntu Linux.


ви можете вибрати відповідь?
Еван Керролл

Відповіді:


42

З документації :

 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схема.
dezso

1
INFORMATION_SCHEMA.views просто показує погляди, на які має право поточний користувач. Якщо в базі даних є перегляди, на які поточний користувач не має права, ім'я цих представлень не відображатиметься в результаті. З документа у посиланні на @ Phil: Показано лише ті погляди, на які має доступ поточний користувач (як власник або якийсь привілей).
Cao Minh Tu

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;

IMHO, цей спосіб краще, ніж запит 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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.