首页 > 解决方案 > Postgres 获取足够的视图信息来重现它

问题描述

基本上 - 我想从 postgres 中获取足够的信息来重现一个视图 - 我知道我可以做一个

select * from pg_get_viewdef('my_view')

这让我得到了 select 语句,但不是它的create部分——它可以是普通视图或物化视图——然后可以授予和物化视图索引。

我知道我可以自己完成所有这些工作,但我可能会弄错或遗漏一些东西 - 在 postgres 中是否有更简单的方法?即我可以得到的东西给我完整的 ddl 来重建视图?

标签: postgresql

解决方案


获取语CREATE VIEW​​句和所有GRANTs 的最简单方法是运行pg_dump

pg_dump -t viewschema.viewname dbname

如果您不能使用它,则收集信息会更加困难:

  • 我建议您使用视图pg_viewspg_matviews. 它们包含一列definition,其中包含 的结果pg_get_viewdef。只需在完整的语句前面加上CREATE VIEW CREATE MATERIALIZED VIEW

  • 可以方便地从 获取视图的权限information_schema.table_privileges,但此视图不包含物化视图。

    要直接从元数据中获取权限,您可以使用:

    SELECT c.oid::regclass AS table_or_view
           p.grantor::regrole,
           p.grantee::regrole,
           p.privilege_type,
           p.is_grantable
    FROM pg_class AS c
       CROSS JOIN LATERAL aclexplode(c.relacl) AS p
    WHERE c.relname = 'v';
    

    在这里, a -asgrantee表示PUBLIC


推荐阅读