SQL Server Change Data Capture 是一项从 SQL Server 事务日志中读取历史数据并将其存储在特殊表中的功能。
通过使用特殊的表值函数 (TVF),它允许用户查询这些数据,从而可以获取特定表上的所有更改或仅获取特定时间内更改导致的净更改。
CDC具有一定的优势
它也有一些缺点:
我已经阅读了很多关于 CDC 的文章,虽然我现在知道如何使用它,但我仍然不确定它是否适合我。
我经常听说 CDC 是一个审计工具,但这不是SQL Server 审计的用途吗?它们是用于同一任务的不同工具吗?或者CDC可以用于其他用途吗?
我目前的情况是,我被要求构建一个可靠的数据框架,该框架应该是未来多个应用程序的基础。确切的要求是模糊的,但其中之一是它应该能够跟踪数据历史并将旧条目与其他表中的所有相关数据一起恢复。我现在正在评估 CDC 作为一种选择,但不确定这是否是可行的方法,因为我真的找不到任何推荐的用例。
虽然我很欣赏针对我的特定场景的建议,但答案应该提供有关何时或何时不使用 Change Data Capture 的一般建议。
查看名称数据操作语言 (DML)我会假设,所有包含的语句实际上都是用于操作数据。
据我所知该SELECT语句只能用于查询数据,不能更改它。(INSERT ... SELECT这里不考虑。)
所以是SELECTDML 的一部分,如果是,为什么?
使用 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>,但依赖这种假设似乎有点冒险。未来版本的命名约定可能会发生变化,或者有人可以提供手动捕获实例名称/更改名称。