Snowflake中被CREATE OR REPLACE VIEW覆盖的旧视图SQL代码如何找回
Snowflake覆盖视图找回旧版本SQL源码方法
可以找回,以下是两种可行方案:
方法1:使用Time Travel功能检索
前提:对应视图所属的schema/数据库已开启Time Travel,且覆盖操作发生在数据保留期内(标准版默认保留1天,企业版最多可配置90天)
- 确定视图被覆盖的大致时间,执行以下查询获取指定时间点的视图DDL:
也可以指定精确时间戳查询:-- OFFSET单位为秒,以下示例为查询当前时间往前30分钟的视图定义 SELECT GET_DDL('VIEW', '<替换为你的视图全称,格式为DB_NAME.SCHEMA_NAME.VIEW_NAME>', TRUE) AT(OFFSET => -60*30);SELECT GET_DDL('VIEW', '<替换为你的视图全称>', TRUE) AT(TIMESTAMP => '替换为UTC格式的目标时间,例:2024-05-20 12:00:00'); - 直接执行查询返回的DDL语句即可恢复旧版本视图。
方法2:从查询历史中检索旧DDL
如果超出Time Travel保留期,可以用该方案,查询历史标准版默认保留1年,企业版保留时间更长
- 如果你有ACCOUNT_USAGE视图访问权限,执行以下查询:
SELECT QUERY_TEXT FROM SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY WHERE QUERY_TEXT ILIKE '%CREATE%VIEW%<替换为你的视图名>%' AND EXECUTION_TIMESTAMP < '替换为你执行覆盖操作的UTC时间' ORDER BY EXECUTION_TIMESTAMP DESC LIMIT 1; - 如果你没有ACCOUNT_USAGE访问权限,可以替换为 INFORMATION_SCHEMA.QUERY_HISTORY,该视图默认保留最近7天的查询记录:
SELECT QUERY_TEXT FROM INFORMATION_SCHEMA.QUERY_HISTORY WHERE QUERY_TEXT ILIKE '%CREATE%VIEW%<替换为你的视图名>%' AND EXECUTION_TIMESTAMP < '替换为你执行覆盖操作的UTC时间' ORDER BY EXECUTION_TIMESTAMP DESC LIMIT 1; - 查询返回的第一条结果即为覆盖前最新的视图创建语句。
补充建议
- 如果视图DDL已提交到代码仓库,直接检索仓库历史提交记录是最稳妥的恢复方案。
- 后续修改视图前建议先执行
GET_DDL备份现有定义,或使用CREATE VIEW IF NOT EXISTS代替CREATE OR REPLACE降低误覆盖风险。
内容的提问来源于stack exchange,提问作者csharpvsto
相关产品推荐
相关产品推荐

