在PostgreSQL中获取视图/表所依赖的表列表

在PostgreSQL中获取视图/表所依赖的表列表,postgresql,Postgresql,在PostgreSQL中,是否有一种方法可以基于对外键的使用和对给定表的访问来获取视图/表所依赖的所有表 基本上,我希望能够使用脚本复制视图/表的结构,并希望能够自动获得表的列表,我还需要复制这些表,以便一切正常工作 似乎朝着正确的方向前进,但没有给我预期/需要的结果。有什么建议吗?如果外键设置正确,请使用pg_dump转储表定义 pg_dump -s -t TABLENAME 我认为这是一个相当糟糕的主意。只要复制整个数据库,我认为应用程序需要所有数据,而不仅仅是一个表中的数据。 此外,还有

在PostgreSQL中,是否有一种方法可以基于对外键的使用和对给定表的访问来获取视图/表所依赖的所有表

基本上,我希望能够使用脚本复制视图/表的结构,并希望能够自动获得表的列表,我还需要复制这些表,以便一切正常工作


似乎朝着正确的方向前进,但没有给我预期/需要的结果。有什么建议吗?

如果外键设置正确,请使用
pg_dump
转储表定义

pg_dump -s -t TABLENAME

我认为这是一个相当糟糕的主意。只要复制整个数据库,我认为应用程序需要所有数据,而不仅仅是一个表中的数据。
此外,还有一些触发器,它们可能依赖于某些表,但要知道您必须进行不那么容易的代码分析。

在psql中,将
+
添加到通常的
\d
中,会提供一个“被引用者”列表以及表定义

\d+ tablename

使用Andy Lester提供的信息,我能够提出以下查询来检索我需要的信息

获取外键引用的表:

SELECT cl2.relname AS ref_table
FROM pg_constraint as co
JOIN pg_class AS cl1 ON co.conrelid=cl1.oid
JOIN pg_class AS cl2 ON co.confrelid=cl2.oid
WHERE co.contype='f' AND cl1.relname='TABLENAME'
ORDER BY cl2.relname;
SELECT cl_d.relname AS ref_table
FROM pg_rewrite AS r
JOIN pg_class AS cl_r ON r.ev_class=cl_r.oid
JOIN pg_depend AS d ON r.oid=d.objid
JOIN pg_class AS cl_d ON d.refobjid=cl_d.oid
WHERE cl_d.relkind IN ('r','v') AND cl_r.relname='TABLENAME'
GROUP BY cl_d.relname
ORDER BY cl_d.relname;
获取视图或表中规则所引用的表:

SELECT cl2.relname AS ref_table
FROM pg_constraint as co
JOIN pg_class AS cl1 ON co.conrelid=cl1.oid
JOIN pg_class AS cl2 ON co.confrelid=cl2.oid
WHERE co.contype='f' AND cl1.relname='TABLENAME'
ORDER BY cl2.relname;
SELECT cl_d.relname AS ref_table
FROM pg_rewrite AS r
JOIN pg_class AS cl_r ON r.ev_class=cl_r.oid
JOIN pg_depend AS d ON r.oid=d.objid
JOIN pg_class AS cl_d ON d.refobjid=cl_d.oid
WHERE cl_d.relkind IN ('r','v') AND cl_r.relname='TABLENAME'
GROUP BY cl_d.relname
ORDER BY cl_d.relname;

你在寻找什么样的结果?Greg Smith确实显示了获取所有依赖项所需的内部视图。也许你必须调整它,但仅此而已。我想在现有数据库中创建一个模式,作为整个数据库结构的一部分的“覆盖”,以便大多数表都可以共享,我希望这个过程能够自动化,而不必手动操作,可能会遇到问题。Andy Lester的评论将我引向pg_约束表,以获取外键的必要信息,但pg_视图和pg_规则似乎没有获取规则或视图中依赖哪些表的必要信息。问题是我们希望在现有数据库中创建一个模式,作为“覆盖”只有整个数据库结构的一部分,所以大多数表都可以共享,我希望这一过程自动化,而不是手工操作,可能会遇到问题。@Dave:您是否研究过使用pg_dump,或者创建与之相关的工具。看到你的新问题,我想这个答案已经过时了。不仅仅是这个问题,还有隐藏在角落里的所有其他问题。看起来这将是一个脆弱的解决方案。你能解释一下我将如何用pg_dump来做这件事吗?例如,我有表A和表B,其中表B包含由触发器自动填充的每个用户的来自A的最新条目,然后是表C和视图D(连接A和C)以及E(连接B和C)。C很大,不需要在模式中复制,所以我只希望模式中有A、B、D和E。我如何使用pg_dump用这些表填充模式?我希望能得到一些易于解析的列表,但这基本上只是转储用于创建表/视图的SQL查询,很难在自动脚本中使用。哦,那么你真正想要的是pg_目录。是的,pg_约束和pg_类结合在一起,给了我外键想要的东西,那么视图和规则是否也有类似的东西呢?视图pg_规则和pg_视图只是为您提供了重建的SQL,并且似乎没有一种查询引用表的方法,而pg_约束可以实现这一点。因此,在系统目录表中稍微搜索一下,就会发现pg_重写表,它似乎包含了我在ev_操作列中需要的信息,但它位于编译格式。有没有一种方法可以从这些信息中提取引用的表?我希望能得到一些易于解析的列表,但这基本上只是转储用于创建表/视图的SQL查询,很难在自动脚本中使用。使用正则表达式解析引用表名并不难:
^\s*表”([^”]*)“
没错,但我想我在最初的问题中忘了提到规则。解析出依赖于或受该表规则影响的表似乎要复杂得多。我是pg的新手。这种连接是如何发生的
JOIN pg_dependent as d on r.oid=d.objid
-因为
pg_rewrite
上没有
oid
列-挠头
oid
是一个问题。如果您使用的是多个模式,您应该加入
pg_名称空间
也可以
在cl\u d.relnamespace=ns.oid上以ns.oid
方式加入pg_名称空间作为ns来选择
ns.nspname作为表名之外的ref_schema
。@ekkis
oid
是一个隐式列,只有在显式请求时才能看到它