小编mag*_*tic的帖子

何时使用 CDC 跟踪历史?

SQL Server Change Data Capture 是一项从 SQL Server 事务日志中读取历史数据并将其存储在特殊表中的功能。

通过使用特殊的表值函数 (TVF),它允许用户查询这些数据,从而可以获取特定表上的所有更改或仅获取特定时间内更改导致的净更改。

CDC具有一定的优势

  • 它可以配置为仅跟踪某些表或列。
  • 它能够在一定程度上处理模型更改。
  • 它不会像触发器那样严重影响性能,因为它与事务日志一起工作。
  • 它很容易启用/禁用,并且不需要表上应跟踪的其他列。

它也有一些缺点:

我已经阅读了很多关于 CDC 的文章,虽然我现在知道如何使用它,但我仍然不确定它是否适合我。

  1. CDC 适合哪些任务/场景?(例如,允许用户将数据对象恢复到某个时间点?审计?显示数据的完整历史记录?)
  2. 何时不应使用 CDC,而应求助于基于触发器的自定义解决方案?
  3. 在操作数据库中使用 CDC 并在操作应用程序中使用 CDC 数据是否可以?(例如,将其展示给最终用户)或者这显然是对该功能的滥用?

我经常听说 CDC 是一个审计工具,但这不是SQL Server 审计的用途吗?它们是用于同一任务的不同工具吗?或者CDC可以用于其他用途吗?

我目前的情况是,我被要求构建一个可靠的数据框架,该框架应该是未来多个应用程序的基础。确切的要求是模糊的,但其中之一是它应该能够跟踪数据历史并将旧条目与其他表中的所有相关数据一起恢复。我现在正在评估 CDC 作为一种选择,但不确定这是否是可行的方法,因为我真的找不到任何推荐的用例。

虽然我很欣赏针对我的特定场景的建议,但答案应该提供有关何时或何时不使用 Change Data Capture 的一般建议。

sql-server change-data-capture data-versioning

27
推荐指数
3
解决办法
2万
查看次数

SELECT 语句是否计入 DML?

查看名称数据操作语言 (DML)我会假设,所有包含的语句实际上都是用于操作数据。

据我所知该SELECT语句只能用于查询数据,不能更改它。(INSERT ... SELECT这里不考虑。)

所以是SELECTDML 的一部分,如果是,为什么?

dml select database-theory

6
推荐指数
2
解决办法
9517
查看次数

如何检索给定表的捕获实例?

使用 SQL Server 2012,我有一个分层表布局 (TPT)。所有表都“继承”自同一个基表 ( dbo.DataObjects)。所有表都通过 CDC 启用历史记录跟踪。

我正在尝试编写一个通用函数,该函数返回给定类型的 CDC 历史信息,包括所有基表中的相关信息。

假设我的类型是直接继承自 的User表,我的查询应该如下所示:dbo.Usersdbo.DataObjects

DECLARE @Begin_LSN binary(10),@End_LSN binary(10) 
SELECT @Begin_LSN = sys.fn_cdc_get_min_lsn('dbo_Users') 
SELECT @End_LSN = sys.fn_cdc_get_max_lsn() 
SELECT * FROM cdc.fn_cdc_get_all_changes_dbo_DataObjects(@Begin_LSN, @End_LSN,'ALL') AS a 
JOIN cdc.fn_cdc_get_all_changes_dbo_Users(@Begin_LSN, @End_LSN,'ALL') AS b 
ON a.__$start_lsn = b.__$start_lsn
WHERE ID = 10;
Run Code Online (Sandbox Code Playgroud)

这将为我提供 ID 为 10 的用户的完整历史记录,包括基表中的列。

现在我想动态构建这种查询。

我的问题之一是 cdc 检索历史信息的函数包括捕获实例的名称:

cdc.fn_cdc_get_all_changes_<capture_instance>
Run Code Online (Sandbox Code Playgroud)

我还需要第二行中的捕获实例的名称来获取最小 lsn:

sys.fn_cdc_get_min_lsn('<capture_instance>') 
Run Code Online (Sandbox Code Playgroud)

当我为表启用 CDC 时,捕获实例名称会自动创建,或者手动传递。如果我不想自己跟踪捕获实例名称,有没有办法检索给定表的捕获实例的名称

我知道每个表可以有多个捕获实例(我认为最多 2 个),但我可能总是每个表只使用一个。

PS:我也知道捕获实例名称通常是以 的方式构建的<schema>_<table>,但依赖这种假设似乎有点冒险。未来版本的命名约定可能会发生变化,或者有人可以提供手动捕获实例名称/更改名称。

sql-server change-data-capture

2
推荐指数
1
解决办法
9331
查看次数