Como listar todas as visualizações no SQL no PostgreSQL?

42

Como listar todas as visualizações de um banco de dados usando um comando SQL no PostgreSQL?

Gostaria de algo semelhante à saída do \dvcomando psql , mas de preferência apenas uma lista de nomes de exibição. por exemplo,

SELECT ...;
my_view_1
my_view_2
my_view_3

Estou executando o PostgreSQL v9.1.4 no Ubuntu Linux.

Rob Bednark
fonte

Respostas:

44

A partir da documentação :

 select table_name from INFORMATION_SCHEMA.views;

Se você não deseja que as visualizações do sistema sejam o seu resultado, tente o seguinte:

 select table_name from INFORMATION_SCHEMA.views WHERE table_schema = ANY (current_schemas(false))
Philᵀᴹ
fonte
Obrigado @Phil. No entanto, esse comando retorna 128 linhas, enquanto \ dv retorna 57 linhas. Parece estar me dando visualizações do sistema também, como "tabelas", "colunas", "domínios", "pg_role" etc. etc. Como obtenho apenas as visualizações que criei?
Rob Bednark
Ele fornece uma lista daqueles a que você tem acesso. Para obter um para um determinado esquema, adicione where table_schema='USERNAME'-o à consulta
Philᵀᴹ
@phil Isso funciona apenas se houver um esquema nomeado de forma idêntica ao usuário. Por padrão, esse não é o caso, no entanto, existe o publicesquema.
Dezso
1
O arquivo INFORMATION_SCHEMA.views mostra apenas as visualizações nas quais o usuário atual tem direito. Se houver visualizações no banco de dados em que o usuário atual não possui direitos, o nome dessas visualizações não será exibido no resultado. No documento no link do @ Phil: somente essas visualizações são mostradas às quais o usuário atual tem acesso (por ser o proprietário ou ter algum privilégio).
Cao Minh Tu
21

Você pode consultar pg_catalog.pg_viewsas informações desejadas:

select viewname from pg_catalog.pg_views;

Consulta refinada para obter também o nome do esquema - caso você tenha várias visualizações com o mesmo nome em esquemas diferentes - e deixe de fora as visualizações do sistema:

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

IMHO, desta maneira é melhor do que consultar o arquivo INFORMATION_SCHEMA.views por razões declaradas no meu comentário à resposta do Phil .

Cao Minh Tu
fonte
4

Se você precisar apenas de forma interativa enquanto estiver no local psql, também poderá usar \dvpara mostrar visualizações ou \dmpara visualizações materializadas. Ou use com +, como \dm+por exemplo, para mostrar algumas informações adicionais (principalmente úteis para ver o tamanho da visualização materializada).

Timur
fonte
1
\dv *.*e \dm *.* para essas informações sobre todos os esquemas!
Pak
3

Experimentar:

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

Se você deseja obter mais detalhes, pode modificar o seguinte para atender às suas necessidades:

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
fonte
2

Eu criei um viewpara listar um catálogo de views:

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

E quando eu quero ver todas as visualizações no banco de dados eu escrevo:

select * from show_views;
omar
fonte
0

Aqui está uma consulta que mostrará suas visualizações materializadas e mostrará as dependências das visualizações.

-- 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
;
Henry Tseng
fonte