如何识别Snowflake中SQL所引用的所有数据库与对象?
如何识别Snowflake中SQL查询引用的所有数据库/对象
方法1:利用QUERY_HISTORY中的QUERY_OBJECT_REFERENCES字段
Snowflake的QUERY_HISTORY视图(优先使用ACCOUNT_USAGE下的版本,覆盖范围比INFORMATION_SCHEMA更广)包含QUERY_OBJECT_REFERENCES变体字段,它会记录SQL执行时实际解析后的所有对象引用——包括通过变量、IDENTIFIER()函数动态生成的对象名,直接解决你之前解析原始SQL文本的局限性。
示例查询
以下查询会展开QUERY_OBJECT_REFERENCES数组,提取每个引用对象的数据库、模式、名称和类型:
SELECT qh.query_id, qh.query_text, obj.value:database_name::STRING AS referenced_database, obj.value:schema_name::STRING AS referenced_schema, obj.value:object_name::STRING AS referenced_object, obj.value:object_type::STRING AS object_type FROM account_usage.query_history qh, LATERAL FLATTEN(input => qh.query_object_references) obj WHERE qh.execution_status = 'SUCCESS' -- 可选:过滤时间范围或查询类型 AND qh.start_time >= DATEADD(day, -7, CURRENT_TIMESTAMP) ORDER BY qh.start_time DESC;
注意事项
- 权限要求:需要
MONITOR USAGE账户权限,或对目标数据库/模式拥有USAGE权限才能查看对应对象引用。 - 数据延迟:
ACCOUNT_USAGE视图通常有1-2小时延迟,如果需要实时数据,可改用INFORMATION_SCHEMA.QUERY_HISTORY(仅包含当前会话/用户的最近查询),该视图同样支持QUERY_OBJECT_REFERENCES字段。
方法2:结合QUERY_HISTORY与ACCESS_HISTORY(追踪细粒度对象访问)
如果需要更详细的对象访问记录(比如区分读/写操作),可以使用ACCOUNT_USAGE.ACCESS_HISTORY视图,它会记录每个查询对对象的具体访问类型,并关联到查询ID。
示例查询
SELECT ah.query_id, qh.query_text, ah.object_name, ah.database_name, ah.schema_name, ah.access_type FROM account_usage.access_history ah JOIN account_usage.query_history qh ON ah.query_id = qh.query_id WHERE qh.execution_status = 'SUCCESS' AND ah.start_time >= DATEADD(day, -7, CURRENT_TIMESTAMP) ORDER BY ah.start_time DESC;
注意事项
ACCESS_HISTORY仅记录表、视图、物化视图等对象的访问,不包含存储过程、函数内部的引用。- 同样存在数据延迟,且需要
MONITOR USAGE权限。
为什么之前的方法失效
- 解析
SQL_TEXT:无法处理动态生成的对象名(变量、IDENTIFIER()函数),这类对象名是在查询执行时才解析的,原始SQL文本中只有占位符。 DATABASE_NAME字段:仅记录查询执行时的上下文数据库,而非SQL实际引用的所有数据库。
内容的提问来源于stack exchange,提问作者Ankit Srivastava
相关产品推荐
相关产品推荐

