AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 269718
Accepted
Dimitrios Desyllas
Dimitrios Desyllas
Asked: 2020-06-24 05:15:43 +0800 CST2020-06-24 05:15:43 +0800 CST 2020-06-24 05:15:43 +0800 CST

如何找出哪些视图在生成它们的 sql 代码中使用了其他视图?[复制]

  • 772
这个问题在这里已经有了答案:
Postgres 视图列参考 1 个回答
2年前关闭。

我正在将视图使用映射到一个未知的数据库方案。我收到了一份包含一些观点的清单:

view_a
view_b
view_c

我想搜索我的数据库哪些视图依赖于另一个视图,例如,如果 view_c 是通过以下 sql 查询生成的:

CREATE VIEW view_c AS SELECT * from view_a JOIN view_b WHERE view_a.column=344

我想以某种方式列出该view_c用途view_a和view_bExcel 表。现在是通过查看 Dbeaver 上的视图 dll sql 并从中找出来手动完成的。但这是一项非常费力的工作,并且可能会错过一些视图依赖项,所以你知道如果我可以通过 information_schema.* 的查询生成 Excel 表tables吗?

postgresql
  • 2 2 个回答
  • 599 Views

2 个回答

  • Voted
  1. Best Answer
    Dimitrios Desyllas
    2020-06-24T05:49:23+08:002020-06-24T05:49:23+08:00

    您可以通过以下查询获取哪个视图使用另一个视图:

    select 
        pg_views.viewname ,
        pg_views2.viewname as view_used from pg_views, pg_views as pg_views2 
    where 
        pg_views.definition ilike '%'||pg_views2.viewname||'%' 
        and pg_views.viewname <> pg_views2.viewname
        and pg_views.schemaname = 'public' and pg_views2.schemaname='public'
    ;
    

    如果您想搜索特定的视图列表:

    select 
        pg_views.viewname ,
        pg_views2.viewname as view_used from pg_views, pg_views as pg_views2 
    where 
        pg_views.definition ilike '%'||pg_views2.viewname||'%' 
        and pg_views.viewname <> pg_views2.viewname
        and pg_views.schemaname = 'public' 
        and pg_views2.schemaname='public'
        and pg_views2.viewname in ('view_a','view_b','view_c')
    ;
    

    如果您需要哪个物化视图使用另一个物化视图,则可以使用此查询:

    select 
        pg_matviews.matviewname ,
        pg_matviews2.matviewname as view_used from pg_matviews, pg_matviews as pg_matviews2 
    where 
        pg_matviews.definition ilike '%'||pg_matviews2.matviewname||'%' 
        and pg_matviews.matviewname <> pg_matviews2.matviewname
        and pg_matviews.schemaname = 'public' 
        and pg_matviews2.schemaname='public'
    ;
    

    整个想法是使用pg_views普通视图或pg_matviews将它们连接在一起并在其 sql 代码中搜索哪个视图使用了另一个视图。

    例如,为了查看哪个视图使用了另一个物化视图:

    select 
        pg_views.viewname ,
        pg_matviews.matviewname as view_used 
    from pg_views, pg_matviews 
    where 
        pg_views.definition ilike '%'||pg_matviews.matviewname||'%' 
        and pg_views.schemaname = 'public' 
        and pg_matviews.schemaname='public'
    ;
    

    它在 postgresql 11 上进行了测试。

    • 1
  2. a_horse_with_no_name
    2020-06-24T05:58:37+08:002020-06-24T05:58:37+08:00

    您可以view_table_usage为此使用:

    下面将显示 view_c 使用的所有对象。

    select vtu.table_schema, 
           vtu.table_name, 
           CASE cl.relkind 
              WHEN 'r' THEN 'TABLE'
              WHEN 'i' THEN 'INDEX'
              WHEN 'S' THEN 'SEQUENCE'
              WHEN 'v' THEN 'VIEW'
              WHEN 'm' THEN 'MATERIALIZED VIEW'
              WHEN 'c' THEN 'TYPE'
              WHEN 't' THEN 'TOAST'
              WHEN 'f' THEN 'FOREIGN TABLE'
           END AS object_type, 
           obj_description(cl.oid) as remarks
    from information_schema.view_table_usage vtu 
      join pg_catalog.pg_class cl on cl.oid = (quote_ident(vtu.table_schema)||'.'||quote_ident(vtu.table_name))::regclass 
    where (view_schema, view_name) = ('public', 'view_c') 
    order by view_schema, view_name 
    

    如果您使用view_a作为输入运行该查询,您将获得使用的表(和其他对象)view_a。

    • 1

相关问题

  • 我可以在使用数据库后激活 PITR 吗?

  • 运行时间偏移延迟复制的最佳实践

  • 存储过程可以防止 SQL 注入吗?

  • PostgreSQL 中 UniProt 的生物序列

  • PostgreSQL 9.0 Replication 和 Slony-I 有什么区别?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve