如何在 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 cc 没有依赖项);但是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 中的模式中选择表?

如何在 python 中定义正在写入 AWS Redshift Postgres DB 的数据的列类型

Postgres SQL (Amazon Redshift) 在启动时运行命令