更改数据捕获与记录更改的触发器

got*_*tqn 3 trigger sql-server t-sql change-data-capture sql-server-2016

我将创建由触发器填充的历史表(在插入、更新、删除之后)。由于只有 20% 的列要更新,我决定只记录更改的值 - 如果值没有更改,NULL则将在历史表中使用值。例如:

在此处输入图片说明

sparse与记录所有数据的普通实现相比,历史表列将节省大量空间(这是由于我的测试和我的业务案例)。

作为我的SQL Server 2016 SP1 standard edition支持者,Change Data Capture我想知道他们使用它和基于触发器的日志记录之间有什么优点/缺点/区别?

我检查了一些文章(这里这里),但看不出还有什么Change Data Capture可以给我的。

Bre*_*zar 6

鉴于这两件事之间的选择,这就是我选择触发器的原因:

  • 触发器可以同步进行相关的表更改(例如,如果您需要更新报告表或检查引用完整性)
  • 触发器允许您以适合您的格式存储数据,而 CDC 将其放入其自己的 CDC 架构中,即可能不适用于您的报告的表中
  • 触发器可以具有检查更新类型或更新源的逻辑,并且只记录您想要记录的内容
  • 触发器可以很容易地临时禁用,例如批量加载,或者如果企业面临巨大的负载需求(例如黑色星期五销售)
  • 触发器让你可以放入更多的业务逻辑,比如你想把某些类型的历史放在一个表中,而将其他类型的历史放在另一个表中
  • 触发器不会直接增加存储开销(而 CDC 每行至少增加 34 个字节)


jya*_*yao 6

@Brent Ozar 列出了使用触发器的优点(这是好的和有效的点),但为了做出明智的决定,我想列出 CDC 的一些优点。

  • 触发器与您的 DML 事务紧密耦合(或同步),而 CDC 不是,因为 CDC 是通过单独的 sql 作业读取日志来实现的。结果是您的 DML 事务不受触发器性能的影响。
  • 如果您想对多个表实施更改数据日志记录,而触发器可能需要大量编码工作,则 CDC 更具可扩展性。
  • 触发器让 DBA 更头疼(例如不知道它或在故障排除期间),而 CDC 则不那么令人头疼。
  • CDC 也可以很容易地在单个表上禁用(恕我直言,触发器在这里没有展示任何优势)

在一天结束时,我会说尝试在触发器和 CDC 上下文中运行一些边界情况,例如批量数据更改(更新/删除/插入),看看您是否有任何问题,例如性能、管理便利性等等,然后做最后的决定。

  • 我认为您和 Brent 都为我更喜欢 CDC 的每项技术提供了很好的理由,因为它在我的环境中得到了广泛的使用。一旦你掌握了模式的窍门以及在哪里可以找到你需要的信息,这真的很不可思议。 (2认同)