查询Snowflake Procedure中引用对象列表的方法咨询
Snowflake存储过程引用对象识别实现思路
目前Snowflake官方的
GET_OBJECT_REFERENCES函数仅支持视图场景,暂未原生支持存储过程的依赖对象查询,可通过以下三种思路实现:
第一种:纯SQL静态正则扫描
第一步先拉取对应范围内的存储过程源码:SELECT PROCEDURE_CATALOG, PROCEDURE_SCHEMA, PROCEDURE_NAME, PROCEDURE_DEFINITION FROM INFORMATION_SCHEMA.PROCEDURES -- 可按需过滤指定库、模式范围 WHERE PROCEDURE_CATALOG = 'YOUR_DATABASE'再通过正则匹配提取对象引用,过滤保留字后得到初步结果:
SELECT PROCEDURE_NAME, DISTINCT VALUE AS MATCHED_OBJECT FROM TABLE(FLATTEN( INPUT => REGEXP_SUBSTR_ALL( PROCEDURE_DEFINITION, '\\b([A-Za-z0-9_$]+\\.){1,2}[A-Za-z0-9_$]+\\b' ) )) -- 可根据实际场景扩展保留字过滤列表 WHERE NOT MATCHED_OBJECT IN ('SELECT','FROM','WHERE','INSERT','UPDATE','DELETE','CALL')优势是无需额外工具,纯SQL即可快速实现;劣势是无法识别动态拼接生成的对象名,容易误匹配保留字
第二种:语法解析AST提取
可使用Python等语言的SQL解析库,先提取存储过程中的所有SQL语句片段,解析生成抽象语法树(AST)后,直接提取所有Table、View类型的节点。
优势是匹配准确率远高于正则,可处理大部分非完全动态的对象引用;劣势需要额外开发解析逻辑,无法识别完全依赖变量拼接的动态对象名第三种:运行时审计全量采集
针对有动态拼接逻辑的存储过程,可通过查询审计实现全量采集:- 覆盖存储过程所有执行分支跑测试用例
- 从
SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY视图过滤该存储过程执行产生的所有查询记录 - 对每条查询调用
GET_OBJECT_REFERENCES函数获取引用对象,去重后得到全量依赖列表
优势是准确率最高,可覆盖所有动态生成的对象引用;劣势需要完备的测试用例覆盖所有执行分支
注意事项
- 扫描到省略库、模式前缀的对象时,需结合存储过程所属的库、模式以及会话默认参数补全全限定名,避免同名对象识别错误
- 若存储过程内部调用了其他存储过程,需要递归扫描被调用存储过程的定义,才能拿到完整的依赖链
- 对JavaScript/Python等非SQL脚本编写的存储过程,需额外处理代码中的字符串拼接、变量赋值逻辑,降低误识别率
内容的提问来源于stack exchange,提问作者akshindesnowflake
相关产品推荐
相关产品推荐

