捕获 SQL Server CDC 中更改的日期时间

RTh*_*mas 8 sql-server-2008 change-data-capture system-tables

因此,我们已经开始探索在我们的生产数据库之一上使用变更数据捕获。我们想知道每次更改的日期时间。阅读演练和教程等,似乎标准方法是使用 LSN 与cdc.lsn_time_mapping系统表相关联。这种方法有效,但在谈论每天成千上万的变化时不是很直接也不是很有效。

在测试环境中,我对变更跟踪表进行了以下调整。我发布了一个ALTER TABLE声明,在名为的末尾添加一列并将其设为[__ChangeDateTime]默认值GetDate()。该方法似乎有效,更改跟踪仍然正常运行,正在捕获日期时间。 但是乱搞系统表让我有点紧张。

如果这不是微软从一开始添加系统字段,他们一定有他们的理由。既然他们选择了 LSN 到 cdc.lsn_time_mapping 方法,我是否通过这种方式创建自己的 hack 来解决问题?

更新:

在测试期间发现 GetDate() 有时不足以满足我们的需求 - 多个更改同时共享。建议使用sysdatetime() 和 datetime2将值移出到纳秒。显然只有 2008+ 的选项。

Jon*_*gel 8

请记住,CDC 使用日志读取器代理来填充更改表。为什么这很重要?通过这种机制,行在更改表中的显示与基表中所做的更改异步

实际上可以记录 3 个不同的时间点,按时间倒序排列:

  1. 更改传送到更改表的时间(这是您正在记录的内容)。
  2. 包含更改的事务提交的时间(使用cdc.lsn_time_mapping)。
  3. 您手动填充基表中的列的时间(使用默认约束、触发器等)。

所以首先要明确你想记录什么。通常我们会关心#2 或#3。

如果 LSN 映射机制 (#2) 对您来说性能不够好,唯一受支持的替代方法是向基表添加一列并自行填充它 (#3)。

关于更改内部表,作为政策问题,我认为最好避免在有支持的替代方案时使用内部结构。您最不希望发生的事情是一个重要的生产系统出现故障,需要致电产品支持,并因此而被拒绝服务。不要介意它可能会破坏事物(升级)或因为意外而被破坏(关闭 CDC,然后再打开,如另一个答案中所述)的问题。