snowflake-cloud-data-platform - 雪花中流的奇怪行为
问题描述
这是关于表上的流被清空的,即使我确保“开启”条件与源表和目标表中的 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 行。
您能否让我知道我做错了什么或者这是流的预期行为?
解决方案
您是否尝试过使用显式事务语句?
来自雪花文档 -
要确保多个语句访问流中的相同更改记录,请使用显式事务语句 (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)
推荐阅读
- c# - 将文本(字符串值)附加到 txt 文件的每一行
- mongodb - MongoBD Compass querySrv ENODATA _mongodb._tcp.cluster0.yqxra.gcp.mongodb.net
- laravel - 如何在不使用 DB::raw 的情况下编写 Laravel 雄辩的查询,这样它就不必将 MySQL 严格模式设置为 false
- javascript - 使用 Google Apps 脚本问题将 Google 表单响应传输到 Google 表格
- php - 我无法创建登录名来登录帐户
- python - 如何捕获从 MYSQL 触发器(嵌入在另一个 py 脚本中)内部调用的 python 脚本的输出?
- python - Python asyncio 处理取消任务
- r - Stargazer 导出到 excel (xlsx)
- php - PHP子串计数函数
- lua - Lua脚本 - 按下鼠标按钮时多键,释放时停止