如何在PostgreSQL中使用SQL命令列出数据库的所有视图?

我想要类似于psql \dv命令的输出,但最好只是一个视图名称列表。例如,

SELECT ...;
my_view_1
my_view_2
my_view_3


我正在Ubuntu Linux上运行PostgreSQL v9.1.4。

#1 楼

从文档中:

 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”等。如何获取我创建的视图?

–罗布·贝德纳克
2012年9月6日在18:28

它为您提供了您可以访问的列表。要获取给定架构的架构,请在查询中添加table_schema ='USERNAME'

–Philᵀᴹ
2012年9月6日18:37

@phil仅当存在与用户名称相同的模式时,此选项才有效。默认情况下不是这种情况,但是有公共模式。

– dezso
2012年9月6日19:12

INFORMATION_SCHEMA.views仅显示当前用户有权使用的视图。如果数据库中有当前用户无权使用的视图,则这些视图的名称将不会显示在结果中。从@Phil链接中的文档中:仅显示当前用户有权访问的那些视图(通过成为所有者或具有某些特权的方式)。

–曹Min
13年11月28日在4:01



#2 楼

您可以查询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更好,原因是我对Phil的回答的评论中所述。

#3 楼

如果仅在psql中交互式需要此功能,则还可以使用\dv显示视图,或使用\dm显示实例化视图。或与+一起使用,例如\dm+,以显示一些其他信息(对于查看实例化视图的大小非常有用)。

评论


\ dv *。*和\ dm *。*了解所有模式的信息!

–白
19年7月22日在15:43



#4 楼

请尝试:

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
;


#5 楼

我创建了一个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;


#6 楼

这是一个查询,它将同时显示您的物化视图并向您显示视图的依存关系。

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


评论


这是一个非常好的帖子!当我在寻找一种分析postgres中的视图依赖关系的方法时,我偶然发现了这个问题。非常感谢您的投入。解决这个问题节省了我很多时间。对于那些感兴趣的人:我做了一些更改,将视图和表包含为源对象,然后将信息导出到Excel,并将其导入到图形编辑器yEd中。结果是视图依赖树的可视化效果很好。

– SebastianH
20年4月1日,11:39