如何在 SnowFlake 中加入 query_id 和 METADATA$ROW_ID
Posted
技术标签:
【中文标题】如何在 SnowFlake 中加入 query_id 和 METADATA$ROW_ID【英文标题】:How to join query_id & METADATA$ROW_ID in SnowFlake 【发布时间】:2020-01-13 08:54:27 【问题描述】:我正在努力跟踪数据的变化以及一些审计细节,比如做出变化的用户。
Snowflake 中的Streams 提供了增量记录的详细信息和一些审计列,包括 METADATA$ROW_ID。
另一个表,即 information_schema.query_history 包含查询历史详细信息,包括 query_id、用户名、数据库名称、模式名称等。
我正在寻找一种方法,以便我可以加入 query_id 和 METADATA$ROW_ID,以便我可以找到与数据的每次更改对应的 user_name。
任何线索将不胜感激。
问候, 尼拉杰
【问题讨论】:
【参考方案1】:流中的METADATA$ROW_ID
列唯一标识源表中的每一行,以便您可以使用流跟踪其更改。
它不是用来跟踪谁更改了数据,而是用来跟踪如何更改了数据。
据我所知,Snowflake 不会跟踪谁更改了单个行,这是您必须自己构建到应用程序中的东西 - 例如,通过像 updated_by
这样的列。
【讨论】:
感谢 @SimonD 澄清 ROW_ID 的使用。【参考方案2】:我发现的唯一方法是添加
SELECT * FROM table(information_schema.QUERY_HISTORY_BY_SESSION()) ORDER BY start_time DESC LIMIT 1
在报告/表格/行生成期间
假设您没有更改设置,即您可以在一个会话中同时运行更多查询,获取正在运行的查询 id,将其更改为 CTE 并在选择的最后部分进行交叉连接以将其插入所有行。
这样你就可以得到 query_history 表中的所有变量。另请记住,雪花确实可以将 SNOWFLAKE.ACCOUNT_USAGE.QUERY_HISTORY(和其他数据)保存一年。所以我推荐每周/每月的工作,将数据合并到长期历史表中。这样一来,您还可以更轻松地处理对历史数据的访问,而不是为用户提供 accountadmin 角色。
【讨论】:
以上是关于如何在 SnowFlake 中加入 query_id 和 METADATA$ROW_ID的主要内容,如果未能解决你的问题,请参考以下文章