在本地SQL Server数据库中,我有许多表中插入了一系列商店的各种销售数据。我想将这些数据"收获"到每个数据工厂的15分钟,并在本地数据管理网关中"收获"这些数据。显然,我对每15分钟复制一次不感兴趣,而只是在复制自上次获取以来已插入的行。据我所知,文档建议为此目的使用数据"切片"。但是,据我所知,这些切片需要一个时间戳(例如DateTime)列,在表格中从。
中获取数据的表格上存在。- 我可以在没有这样的时间戳列的情况下执行" delta"提取(即,自上次获取以来只插入的行)吗?我可以使用顺序整数列吗?甚至根本没有逐步增加的列?
- 假设最后一个切片的窗口从08:15到08:30。现在,如果数据库服务器上的时钟有点落后于Azure时钟,则可能会添加一些行,将时间戳设置为08:29 获取下一个切片(08:30至08:45)时包括。有没有明智的方法来避免这个问题?将切片窗口转移到过去几分钟可以最大程度地减少风险,但不能完全消除它。
将Azure Data Factory从等式中取出。您如何安排将三角洲转移到目标系统?我认为您有一些选择:
- 将创建的日期/更改列添加到源表。编写参数化查询以仅拿起新的或修改的值。ADF通过时间切片和系统变量支持此方案。重新身份列,您可以使用存储过程(根据此处)和跟踪发送的最后一个ID的表进行操作。
- 在源系统上参与更改数据捕获(CDC)。这将使您可以通过CDC函数访问Deltas。将它们包裹在PROC中,并使用系统变量呼叫,类似于上面的示例。
- 始终将所有数据,例如在目标上分配表。使用Delta Code
EXCEPT
和MERGE
来确定哪些记录的更改;显然,对于大卷而言,这不是理想的选择,这将适用于少量。
hth
我们计划将此功能添加到ADF中。它可能从顺序整数列而不是时间戳开始。您能让我知道顺序整数是否会有所帮助?
通过在SQL Server上启用"更改跟踪",您可以在" SYS_CHANGE_VERSION"上利用" SYS_CHANGE_VERSION"来从本地SQL Server或Azure SQL数据库通过Azure Data Factory加载数据。
https://learn.microsoft.com/en-us/azure/data-factory/tutorial-incremental-copy-change-change-tracking-feature-portal-portal-portal-portal
如果使用SQL Server 2016,请参见https://msdn.microsoft.com/en-us/library/mt631669999.aspx#enabling-system-system-versioning-systeming-systeming-new--a-a-new--new--new--new--new--new--new--new--new--表格审计。否则,您可以使用触发器实现相同的操作。
并使用NTP同步服务器时间。