Azure映射数据流顺序写入双SQL接收器时如何获取首表自增ID
Azure映射数据流获取SQL自增ID写入审计表实现方案
映射数据流原生的直接表写入接收器不会自动回传Azure SQL侧生成的自增标识列值,无法在插入第一个表的同一步骤直接拿到生成的ID,可根据实际场景选择以下落地方法:
方案1:存储过程接收器模式(生产环境首选,零数据一致性风险)
- 不要将第一个接收器配置为直接写入目标业务表,改用接收器的「存储过程」写入模式
- 提前在Azure SQL中创建对应写入存储过程,逻辑如下:
- 定义入参接收传入的所有业务字段(不需要传入自增ID列)
- 执行INSERT语句将入参写入业务表
- 调用
SCOPE_IDENTITY()函数获取当前连接作用域内刚生成的准确自增ID值,不会受其他并发写入、触发器生成ID的干扰 - 直接在存储过程内将业务字段、获取到的自增ID、审计字段(操作时间、操作批次等)写入审计表
- 若后续数据流步骤需要用到自增ID,可将ID作为存储过程输出参数返回给数据流
该方案不需要在数据流中编排两次写入的依赖顺序,所有插入、ID获取、审计写入逻辑都在SQL侧同一个会话内完成,完全不会出现ID匹配错误的问题
方案2:插入后回查匹配(适合无权限创建存储过程的场景)
如果必须使用直接表写入模式,按以下步骤配置:
- 在数据流写入业务表之前,新增派生列转换,用
UUID()函数给每一行生成一个全局唯一的trace_id值,同时给业务表新增一个可空的trace_id字段 - 配置第一个接收器写入业务表时,将生成的
trace_id一并写入表中,同时给整批数据写入统一的批次号(可由管道参数传入) - 第一个接收器写入完成后,新增源步骤连接同一个Azure SQL,查询业务表中匹配当前批次号的所有记录,查询结果中会自带SQL生成的自增ID和之前写入的
trace_id - 将回查得到的数据集和原始数据流按照
trace_id做内连接,即可给每一行原始数据匹配到对应的自增ID - 将关联完成、携带准确自增ID的数据集写入审计表接收器即可
注意:不要跳过trace_id直接用批次号关联,同一批次下多行数据无法通过批次号完成行级匹配;回查时必须加批次号过滤,避免捞到其他任务写入的历史数据
方案3:数据流侧预生成主键(适合未上线的新业务表场景)
如果业务表还未正式投入使用,可以直接放弃SQL侧的标识列自增规则:
- 在数据流中使用「代理键」转换,提前给每一行按照配置的起始值、步长生成有序主键ID
- 此时ID在写入第一个接收器之前就已经存在于数据流中,不需要等待SQL侧回传
- 直接将预生成的ID连同业务字段写入第一个业务表,再同步写入第二个审计表即可
注意:如果有多个任务并行写入同一张业务表,需要提前给不同任务划分不重叠的ID区间,避免出现主键冲突
避坑提醒:不要尝试在写入后通过查询表最大ID、再按行号偏移的方式匹配自增ID,并发写入场景下这种方式拿到的ID和实际插入的行必然会出现错位,直接导致审计数据关联错误。
内容的提问来源于stack exchange,提问作者user961
相关产品推荐
相关产品推荐

