部分用户无法获取sys.dm_tran_commit_table视图当前行数据的问题
长期使用Change Tracking将数据同步至EDW,此前所有表均为SCD Type 0或Type 1。在配置SCD Type 2表时,将sys.dm_tran_commit_table加入查询,此时发现数据缺失问题。
设置了简单测试:
SELECT MAX(commit_ts), MAX(commit_time) FROM sys.dm_tran_commit_table
执行该查询时,本人能获取当前值,但其他用户得到的数据存在数小时延迟,具体结果如下:
| 用户ID | MAX(commit_ts) | MAX(commit_time) |
|---|---|---|
| 本人 | 1875390 | 2022-10-11 17:21:21.330 |
| 其他用户 | 1875200 | 2022-10-11 16:09:30.640 |
未找到相关解决方案。此外还发现一个相关问题:某数据库中本人能获取当前数据,但其他用户得到的数据截至2022-09-29(延迟11至23天),该数据库所在服务器为MSSQL 2017 RTM(未更新),数据库兼容级别设为SQL Server 2008(100)。
更新1
测试了6个不同系统(SQL2016至SQL2017 CU30),均出现相同结果。MSSQL2017RTM的问题自行解决,但非sysadmin用户查询sys.dm_tran_commit_table的最大值时仍无法获取当前信息。修改了测试查询:
SELECT CHANGE_TRACKING_CURRENT_VERSION(), MAX(commit_ts), MAX(commit_time), GETUTCDATE() FROM sys.dm_tran_commit_table
结果如下:
| 用户ID | CTCV() | MAX(commit_ts) | MAX(commit_time) | UTCDATE() |
|---|---|---|---|---|
| 本人 | 434244345 | 434244344 | 2022-10-12 18:33:25.050 | 2022-10-12 18:33:25.050 |
| 其他用户 | 434244355 | 434240149 | 2022-10-12 18:25:08.327 | 2022-10-12 18:33:26.287 |
仅找到以下说明:
数据库中所有启用Change Tracking的表的变更跟踪信息存储在内存行存储(syscommittable)中,该内存行存储会在每次检查点时刷新到磁盘表(syscommittab),syscommittab内部表的行在每次检查点时被移除。
无法理解为何非sysadmin用户无法从sys.dm_tran_commit_table视图获取当前数据。
编辑2
注意到非sysadmin用户的执行计划中,服务器从SYSCOMMITTABLE返回0行,但sysadmin用户能返回行。两类用户均能从syscommittab的聚集索引扫描获取行,这解释了用户无法查看当前数据的原因。现在认为这是权限问题,正在排查前DBA对系统的配置操作。
内容的提问来源于stack exchange,提问作者CMTalon

