¿Cómo enumerar todas las vistas en SQL en PostgreSQL?

42

¿Cómo enumero todas las vistas para una base de datos usando un comando SQL en PostgreSQL?

Me gustaría algo similar a la salida del \dvcomando psql , pero preferiblemente solo una lista de nombres de vista. p.ej,

SELECT ...;
my_view_1
my_view_2
my_view_3

Estoy ejecutando PostgreSQL v9.1.4 en Ubuntu Linux.

Rob Bednark
fuente

Respuestas:

44

De la documentación :

 select table_name from INFORMATION_SCHEMA.views;

Si no desea que las vistas del sistema sean su resultado, intente esto:

 select table_name from INFORMATION_SCHEMA.views WHERE table_schema = ANY (current_schemas(false))
Philᵀᴹ
fuente
Gracias @ Phil. Sin embargo, ese comando devuelve 128 filas, mientras que \ dv devuelve 57 filas. Parece que también me da vistas del sistema, como "tablas", "columnas", "dominios", "pg_role", etc. ¿Cómo obtengo solo las vistas que creé?
Rob Bednark
Le da una lista de los que tiene acceso. Para obtener los de un esquema dado, agréguelo where table_schema='USERNAME'a la consulta
Philᵀᴹ
@phil Esto funciona solo si hay un esquema nombrado idénticamente para el usuario. Por defecto, este no es el caso, sin embargo, existe el publicesquema.
dezso
1
INFORMATION_SCHEMA.views solo muestra las vistas en las que el usuario actual tiene derechos. Si hay vistas en la base de datos que el usuario actual no tiene derecho (s), el nombre de esas vistas no se mostrará en el resultado. Del documento en el enlace de @ Phil: solo se muestran esas vistas a las que el usuario actual tiene acceso (por ser el propietario o tener algún privilegio).
Cao Minh Tu
21

Puede consultar pg_catalog.pg_viewssu información deseada:

select viewname from pg_catalog.pg_views;

Consulta refinada para obtener también el nombre del esquema, en caso de que tenga varias vistas con el mismo nombre en diferentes esquemas, y omitió esas vistas del sistema:

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

En mi humilde opinión, de esta manera es mejor que consultar información_SCHEMA.views por razones indicadas en mi comentario a la respuesta de Phil .

Cao Minh Tu
fuente
4

Si solo necesita esto de forma interactiva mientras está en psql, también puede usarlo \dvpara mostrar vistas o \dmpara vistas materializadas. O use con +, \dm+por ejemplo, para mostrar información adicional (sobre todo útil para ver el tamaño de la vista materializada).

Timur
fuente
1
\dv *.*y \dm *.* para esa información en todos los esquemas!
Pak
3

Tratar:

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

Si desea más detalles, puede modificar lo siguiente para adaptarlo a sus necesidades:

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

Creé un viewpara enumerar un 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));

Y cuando quiero ver todas las vistas en la base de datos, escribo:

select * from show_views;
omar
fuente
0

Aquí hay una consulta que también mostrará sus vistas materializadas y le mostrará las dependencias de las vistas.

-- 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
fuente