如何确定一行是否已更改?

How can I determine if a row has changed?

我正在为客户构建数据仓库,其中一个数据源是 Dynamics AX 数据库。对于给定的 AX table 我需要确定一行是否已被插入、修改或删除,以便可以在 DW 中插入、更新或删除它。

关于检测已修改的行,在我可以用于此目的的大多数 AX table 中似乎有两列,ModifiedDateTime 和 RecVersion。我有两个与这些专栏相关的问题:

1) ModifiedDateTime 列是否在每次更新行时更新?如果是这样,即使有人在 AX 应用程序之外(例如从 SSMS 等工具)直接更新 table 中的行,该值是否也会更新?

2) 与上述 RecVersion 相同的问题。此外,该数字是在整个数据库中全局唯一还是仅对 table?

唯一

是否有其他我不知道的选择来做我想做的事?

您想使用字段RecIdRecVersion,这些字段在AX 2012的所有业务数据表中都可用。RecIda unique value for each record of a tableRecVersion创建记录后为1,每次更改记录时都会更改为1以外的某个数字。

ModifiedDateTime 不是一个好的选择,因为它不是在所有表上都可用。

关于您质疑当有人直接在 AX 业务数据库中修改数据时是否更新了其中一个字段:答案是否定的,这是您绝对不应该做这样的事情的原因之一。老实说,我已经看到有几个客户因为违背了他们的实施合作伙伴的明确建议而崩溃了。 Dynamics AX 提供了多种选项来集成来自其他系统的数据,使用它们并且不要尝试发明自己的。

关于您的问题 RecVersion 是否全局唯一:否。您可以使用 TableIdRecId 的组合来唯一标识 AX 业务数据库中的记录。

正如我在回答您的问题 时提到的那样,AX 附带了一个数据集市,并且还有一些关于如何根据业务数据的变化更新数据集市的逻辑。我不熟悉这些更新的详细信息,但可能值得研究一下,看看您是否可以将它们重新用于您的目的。

AX 2012 的某些部分在后台使用 SQL 服务器更改跟踪(例如 AIF)。 更改跟踪记录也删除记录,ModifiedDateTime 和 RecVersion 字段都不能给你。