如何检查某个表是不是正在被 AWS Redshift 上的某个程序或视图使用

Posted

技术标签:

【中文标题】如何检查某个表是不是正在被 AWS Redshift 上的某个程序或视图使用【英文标题】:How to check if a table is in use by some procedure or view on AWS Redshift如何检查某个表是否正在被 AWS Redshift 上的某个程序或视图使用 【发布时间】:2021-10-19 05:44:43 【问题描述】:

我正在使用 AWS Redshift。我在一个模式中有 100 多个表,其中一些表的数据每天都会刷新,而有些表根本不会刷新。 我已经找出了数据未刷新的表。 在删除它们之前,我想检查它们当前是否被同一模式或任何其他模式的任何函数/过程/视图使用。 有什么办法可以在 Redshift 上检查一下吗?

【问题讨论】:

【参考方案1】:

我在网上找到了这个代码,不记得在哪里,所以很抱歉我不能记...

我建议将其保存为视图,以便您始终可以轻松运行。

如果您的视图使用了您想要删除的某些表,您可以在视图末尾使用“WITH NO SCHEMA BINDING”。这样,即使有视图使用该表,也可以删除该表。

代码:

SELECT DISTINCT 
    srcobj.oid AS src_oid
    ,srcnsp.nspname AS src_schemaname
    ,srcobj.relname AS src_objectname
    ,tgtobj.oid AS dependent_viewoid
    ,tgtnsp.nspname AS dependent_schemaname
    ,tgtobj.relname AS dependent_objectname
FROM
    pg_catalog.pg_class AS srcobj
INNER JOIN
    pg_catalog.pg_depend AS srcdep
        ON srcobj.oid = srcdep.refobjid
INNER JOIN
    pg_catalog.pg_depend AS tgtdep
        ON srcdep.objid = tgtdep.objid
JOIN
    pg_catalog.pg_class AS tgtobj
        ON tgtdep.refobjid = tgtobj.oid
        AND srcobj.oid <> tgtobj.oid
LEFT OUTER JOIN
    pg_catalog.pg_namespace AS srcnsp
        ON srcobj.relnamespace = srcnsp.oid
LEFT OUTER JOIN
    pg_catalog.pg_namespace tgtnsp
        ON tgtobj.relnamespace = tgtnsp.oid
WHERE tgtdep.deptype = 'i' --dependency_internal
AND tgtobj.relkind = 'v' --i=index, v=view, s=sequence
and src_schemaname <> 'pg_catalog' and src_schemaname <> 'information_schema';

【讨论】:

非常感谢@ItayKirgner。这确实是我需要的神奇查询。我想问我们有条件 tgtobj.relkind = 'v' 来过滤掉仅是视图的依赖对象。如何在依赖对象列表中包含过程和函数?另外,索引和序列的含义是什么?我们已经使用条件 tgtdep.deptype = 'i' 仅用于内部依赖,它会错过任何其他依赖对象吗?再次感谢你很多次!

以上是关于如何检查某个表是不是正在被 AWS Redshift 上的某个程序或视图使用的主要内容,如果未能解决你的问题,请参考以下文章

如何检查模型是不是具有某个列/属性?

Firestore 安全规则 - 如何检查某个字段是不是被修改?

无法使用 aws nodejs sdk 创建 Redshift 表

如何检查从 aws S3 到雪花的数据加载结果

ubuntu如何判断某个端口是不是被隐藏

如何使用指针检查数组中的某个位置是不是被修改