如何在 Redshift 或 Postgres 的视图中获取列依赖关系?
Posted
技术标签:
【中文标题】如何在 Redshift 或 Postgres 的视图中获取列依赖关系?【英文标题】:How to get column dependencies in views in Redshift or Postgres? 【发布时间】:2019-04-16 18:21:41 【问题描述】:我已经定义了一些视图,建立在 Redshift 中的其他视图/表之上,并希望从系统表中获取有关列级别依赖关系的信息。
比如说,我有这些定义:
CREATE TABLE t1 AS (SELECT 2 as a, 4 as b, 99 as c );
CREATE VIEW v1 AS (SELECT a, b FROM t1);
CREATE VIEW v2 AS (SELECT a*b/2 as x FROM v1);
我想做的是在系统或目录表上创建某种查询,这些查询将返回如下内容:
target_column | target_table_or_view | source_column | source_table_or_view |
------------------------------------------------------------------------------
x | v2 | a | v1
x | v2 | b | v1
a | v1 | a | t1
b | v1 | b | t1
我已经尝试过这里给出的解决方案:How to create a dependency list for an object in Redshift?。但是,此查询不会生成我正在寻找的“目标列”列,我不知道如何调整它。
这可能吗?理想情况下,我想在 Redshift 中执行此操作,但如果需要,我可以使用更新版本的 Postgres。
【问题讨论】:
【参考方案1】:PostgreSQL 中没有与“目标列”相关联的依赖关系,因此您在元数据中找不到它。
依赖于源表和列的是完整视图(准确地说是它的查询重写规则)。
【讨论】:
这是真的吗?在 Postgres 11.2 中,使用上面的示例,此命令有效:ALTER TABLE t1 DROP COLUMN c
(c
没有依赖项);但是ALTER TABLE t1 DROP COLUMN a
失败并显示我应该使用CASCADE
的消息。所以 Postgres 11.2 确实“知道”可以删除 c
但不能删除 a
。
这就是你所说的“来源栏”吧?这是被跟踪的,是的。
哎呀,你是对的 :( 我会接受这个答案,你知道这在另一个 SQL 引擎中是否可行吗?
我知道 Oracle 根本不跟踪此类依赖关系,您可以只修改或删除基表,从而使视图“无效”。我不知道其他 RDBMS。以上是关于如何在 Redshift 或 Postgres 的视图中获取列依赖关系?的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有连接的情况下为 postgres (Redshift) 生成 SQL 查询?
如何在架构上同步应用程序工程师 (Postgres) 和数据工程师 (Redshift)
REDSHIFT:如何生成一系列数字而不在 redshift (Postgres 8.0.2) 中创建名为“数字”的表?
R:如何使用 dplyr(函数 scr_postgres)从 redshift 中的模式中选择表?