如何在Snowflake中筛选QUERY_HISTORY表中的特定DML类查询?
从QUERY_HISTORY表筛选指定操作的查询语句及新手建议
一、查询语句示例
假设你用的是带有QUERY_HISTORY系统视图的环境(比如Snowflake),下面是筛选你自己执行过的指定操作查询的SQL:
SELECT QUERY_TEXT, START_TIME, USER_NAME FROM QUERY_HISTORY WHERE USER_NAME = '你的用户名' -- 替换成你实际的用户名 AND LOWER(QUERY_TEXT) REGEXP '^(update|insert|alter|rename|merge|delete|truncate|drop|copy|select|create)' ORDER BY START_TIME DESC;
语句说明:
USER_NAME = '你的用户名':确保只筛选你自己执行的查询,避免混入其他人的操作记录。LOWER(QUERY_TEXT) REGEXP ...:把查询文本转成小写后用正则匹配,避免因为SQL大小写不一导致漏筛或误筛。正则里的^表示匹配语句开头,能避免误抓那些查询内容里包含关键词的情况(比如SELECT * FROM UPDATE_LOG这类语句不会被误捞)。ORDER BY START_TIME DESC:按执行时间倒序排列,方便你优先查看最近的操作。
二、给新手的实用建议
- 先确认表结构:不同环境的QUERY_HISTORY字段可能有差异,比如有的叫
QUERY_STRING而非QUERY_TEXT,有的用EXECUTION_USER代替USER_NAME。可以先执行DESCRIBE TABLE QUERY_HISTORY;(对应环境的查看表结构命令),确认字段名后再调整语句。 - 测试正则匹配:先去掉WHERE条件,查几条样本数据,看看你的查询语句开头的格式(比如有没有带注释或空格),再调整正则。比如如果有的查询开头有空格,可以把正则改成
^\\s*(update|insert...),匹配开头的空格加关键词。 - 分步骤调试:不要一下子写完整的WHERE条件,先查所有自己的查询,确认能拿到数据后,再加操作类型的过滤条件,这样更容易排查问题。
- 区分DML和DDL:你列的操作里,SELECT、INSERT、UPDATE、DELETE、MERGE、COPY属于DML(数据操作语言),CREATE、ALTER、DROP、RENAME、TRUNCATE属于DDL(数据定义语言),如果后续只想看其中一类,直接修改正则里的关键词列表就行。
- 保存常用语句:把这个筛选语句存成个人视图或者记在笔记里,下次要用直接调用,不用重复编写。
- 检查权限:如果执行查询后没有返回数据,大概率是没有访问QUERY_HISTORY的权限,找管理员申请对应权限即可。
内容的提问来源于stack exchange,提问作者SnowPablo
相关产品推荐
相关产品推荐

