Postgres 中的视图列来自哪里?
Where did view columns come from in Postgres?
假设我有一个 PostgreSQL 数据库并且有一个看起来像这样的视图:
select foo.id as id, bar.id as bar_id, ...
from foo join bar on foo.bar_id = bar.id;
哪个查询可以告诉我视图的哪些列来自哪些基础 table/column 组合?
我最接近的是查询information_schema.view_column_usage
。这给了我一切,除了定义了视图中的哪一列。所以我可以说,例如,foo.id
和 bar.id
都在视图中使用。但是我不知道 id
列是来自 foo
还是 bar
.
(是的,我可以手动解析 SQL。但我正在尝试自动分析具有许多视图、许多列以及视图中不明显的列重命名的系统。)
正如 JGH 在他的评论中所说,很容易得出视图列依赖于多个底层对象的视图。
视图定义本身以解析树的形式存储在相应pg_rewrite
条目的ev_action
列中,因此您必须编写C代码并深入研究其内部结构PostgreSQL 来处理它。但请注意:尝试解析文本表示会更加困难。
我只需要 select * from pg_get_viewdef('view_name')
,但您显然需要更多。
虽然它没有完全解决您的问题,但如果您没有看过以下几周前的文章,您可能会发现它很有趣:
滥用 Postgresql 作为 SQL 美化器
https://www.cybertec-postgresql.com/en/abusing-postgresql-as-an-sql-beautifier/
假设我有一个 PostgreSQL 数据库并且有一个看起来像这样的视图:
select foo.id as id, bar.id as bar_id, ...
from foo join bar on foo.bar_id = bar.id;
哪个查询可以告诉我视图的哪些列来自哪些基础 table/column 组合?
我最接近的是查询information_schema.view_column_usage
。这给了我一切,除了定义了视图中的哪一列。所以我可以说,例如,foo.id
和 bar.id
都在视图中使用。但是我不知道 id
列是来自 foo
还是 bar
.
(是的,我可以手动解析 SQL。但我正在尝试自动分析具有许多视图、许多列以及视图中不明显的列重命名的系统。)
正如 JGH 在他的评论中所说,很容易得出视图列依赖于多个底层对象的视图。
视图定义本身以解析树的形式存储在相应pg_rewrite
条目的ev_action
列中,因此您必须编写C代码并深入研究其内部结构PostgreSQL 来处理它。但请注意:尝试解析文本表示会更加困难。
我只需要 select * from pg_get_viewdef('view_name')
,但您显然需要更多。
虽然它没有完全解决您的问题,但如果您没有看过以下几周前的文章,您可能会发现它很有趣:
滥用 Postgresql 作为 SQL 美化器
https://www.cybertec-postgresql.com/en/abusing-postgresql-as-an-sql-beautifier/