假设我有一个PostgreSQL数据库,并且有一个看起来像这样的视图:
select foo.id as id, bar.id as bar_id, ...
from foo join bar on foo.bar_id = bar.id;
哪个查询可以告诉我视图的哪些列来自哪些基础表/列组合?
我最近来的是查询information_schema.view_column_usage
。这给了我一切,除了定义了视图中的哪一列。因此,我可以说,例如,视图中同时使用了foo.id
和bar.id
。但是我不知道id
列是来自foo
还是bar
。
(是的,我可以手动解析SQL。但是,我正在尝试自动分析具有许多视图,许多列以及视图中各列的非明显重命名的系统。)
正如JGH在他的评论中所说,很容易提出视图,其中视图列依赖于多个基础对象之一。
视图定义本身以语法分析树的形式存储在相应ev_action
条目的pg_rewrite
列中,因此您必须编写C代码并深入PostgreSQL的内部结构来进行处理。但请注意:试图解析文本表示形式会更加困难。