SQL Server ChangeTable返回尚不存在的插入行

时间:2014-11-06 02:57:47

标签: sql-server

我正在使用SQL Server 2014的更改跟踪功能将我的应用程序的内部状态与数据库同步,但却遇到了一些意外行为。

我当前的存储过程基于此处的MSDN示例:http://msdn.microsoft.com/en-us/library/bb933874.aspx

似乎发生的事情是SYS_CHANGE_OPERATION是带有主键的插入'I',但是如果我与实际表连接,那里还没有数据 - 更改表上的主键已设置,但主键是表本身和所有其他列都为null。

这导致应用程序端的一些解析错误,我认为这种情况不可能?如果尚未插入数据,它肯定不会报告插入?

我的事务隔离级别是通过快照隔离读取提交的,并且按照MSDN的建议启用了读取提交的快照。

1 个答案:

答案 0 :(得分:1)

事实证明,这不是更改跟踪的问题,而是与另一个表执行内部联接然后针对更改表执行外部联接的结果。

在这种情况下,内部联接没有返回任何行(在另一个表中缺少外键),而带有changetable的外部联接导致“空”插入(所有列为null,除了更改表列),如问题

解决方案是保持查询不变,但添加一个额外的where约束:

WHERE MY.PrimaryKey IS NOT NULL OR CT.SYS_CHANGE_OPERATION = 'D'

这确保了在发生插入或更新时主键不为空,并假设应用程序容忍没有发生先前插入的更新,因为我们基本上过滤掉插入并等待内部连接的后续更新成功。