如何检查某个表是不是正在被 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 安全规则 - 如何检查某个字段是不是被修改?