首页 > 解决方案 > 雪花中流的奇怪行为

问题描述

这是关于表上的流被清空的,即使我确保“开启”条件与源表和目标表中的 1:1 行匹配。

这是一个例子:

我在具有以下状态的表上有一个流。

backup, id, name, metadata$action
a, 1, Joe, DELETE
a, 2, Jane, DELETE
b, 1, Joe, INSERT
b, 2, Jane, INSERT
b, 3, Jake, INSERT

合并前的状态

backup, id, name
a,1,Joe
a,2,Jane

但是当我使用合并语句将它插入目标表时

合并到目标使用流 (target.id = stream.id 和 target.backup = stream.backup) WHEN MATCHED 和 stream.metadata$action = 'DELETE' THEN DELETE;

这会按预期删除目标表,但会完全清空 STREAM,即使 ON 条件确保仅连接 1:1 匹配记录并且条件状态为 DELETE。因此,我丢失了流中的所有 INSERT 行。

您能否让我知道我做错了什么或者这是流的预期行为?

标签: snowflake-cloud-data-platform

解决方案


您是否尝试过使用显式事务语句?

来自雪花文档 -

要确保多个语句访问流中的相同更改记录,请使用显式事务语句 (BEGIN .. COMMIT) 将它们包围。显式事务锁定流,以便在提交事务之前不会向流报告对源表的 DML 更新。

来源:https ://docs.snowflake.com/en/sql-reference/sql/create-stream.html#usage-notes

或者您可以添加另一个语句来处理 INSERT。

例如,

when matched
    and source_table.metadata$action = 'INSERT'
    and source_table.metadata$isupdate then
    update set target_table.text = source_table.text
when matched
    and source_table.metadata$action = 'DELETE' then 
    delete
when not matched
    and source_table.metadata$action = 'INSERT' then 
    insert 
    (whatever you want to insert)

推荐阅读