【问题标题】:CDC tracking changes made to a column that wasn't changedCDC 跟踪对未更改的列所做的更改
【发布时间】:2018-06-22 20:13:31
【问题描述】:

我有一个启用了 CDC 的表,它抛出了以下奇怪的行为。 在三个可空列之一已经具有值[8,23|NULL|NULL] 并且我更新其他两列[AlexJ, 1] 的更新中,CDC 跟踪所有三列的更改。

2018-06-22 13:55:37.763 NULL    NULL    NULL 
2018-06-22 13:55:37.763 8,23    AlexJ   1

我使用模板化查询从 cdc.dbo_Tablename_CT 表中获取这些数据。

...
SELECT sys.fn_cdc_map_lsn_to_time([__$start_lsn]) AS 'ModifiedDate', 
    [Tags],[ModifiedBy], [IsInactive]
FROM cdc.fn_cdc_get_all_changes_dbo_Tablename
    (@from_lsn, @to_lsn, N'all update old')
WHERE Id = @Id
...

我该如何解决这个问题?这是最烦人的,可能会引导我远离使用 CDC,而不是说部署和维护 CDC 的表在最好的时候是在公园里散步。

【问题讨论】:

  • 您确定它没有更新吗?你能发布你的更新声明吗?它不跟踪实际数据更改,它跟踪更新语句。所以将其更新为相同的值与更改值相同。
  • 阳性。我首先注意到它使用 EF 核心 Linq 更新,然后使用 SSMS 中的“编辑 200 行”数据编辑器,然后编写了一个仅包含两列的原始更新语句。各方面的行为都是一样的。
  • EF 和 Edit top 200 都会更新每一列。
  • 那么为什么其他列不显示在 CT 表更改中?因为它们不可为空?即使 EF “更新”每一列,如果值相同,它真的是 CDC 的吗?

标签: sql-server change-data-capture


【解决方案1】:

https://docs.microsoft.com/en-us/sql/relational-databases/system-tables/cdc-capture-instance-ct-transact-sql?view=sql-server-2017

它总是为 varchar(max) ... tags 列设置 null。

大对象数据类型 当 _$operation = 1 或 _$operation = 3 时,数据类型 image、text 和 ntext 的列总是被分配一个 NULL 值。 数据类型为 varbinary(max)、varchar(max) 或 nvarchar(max) 的列) 在 __$operation = 3 时分配一个 NULL 值,除非在更新期间列更改。当 __$operation = 1 时,这些列在删除时被赋值。捕获实例中包含的计算列的值始终为 NULL。

【讨论】:

    猜你喜欢
    • 2018-04-25
    • 1970-01-01
    • 1970-01-01
    • 2018-01-18
    • 2012-01-02
    • 2010-12-24
    • 1970-01-01
    • 2015-10-05
    • 2015-12-06
    相关资源
    最近更新 更多