如何在PostgreSQL的SQL中列出所有视图?


40

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

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

SELECT ...;
my_view_1
my_view_2
my_view_3

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


你可以选择答案吗?
埃文·卡罗尔

Answers:


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

它为您提供了您可以访问的列表。为了让那些对于给定的模式,添加where table_schema='USERNAME'到查询
Philᵀᴹ

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

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;

恕我直言,由于我对Phil的回答的评论中所述的原因,这种方法比查询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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.