使用 SQL Server 2012,我有一个分层表布局 (TPT)。所有表“继承”同一个基表 ( dbo.DataObjects
)。所有表都启用了通过 CDC 进行的历史跟踪。
我正在尝试编写一个通用函数,该函数返回给定类型的 CDC 历史信息,包括来自所有基表的相关信息。
假设我的类型是直接继承自User
的表,我的查询应该是这样的:dbo.Users
dbo.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;
这将为我提供 ID 为 10 的用户的完整历史记录,包括基表中的列。
现在我想动态构建这种查询。
我的问题之一是用于检索历史信息的 cdc 函数包括捕获实例的名称:
cdc.fn_cdc_get_all_changes_<capture_instance>
我还需要第二行中捕获实例的名称来获取最小 lsn:
sys.fn_cdc_get_min_lsn('<capture_instance>')
捕获实例名称要么在我为表启用 CDC 时自动创建,要么手动传递。如果我不想自己跟踪捕获实例名称,有没有办法检索给定表的捕获实例名称?
我知道每个表可以有多个捕获实例(我认为最多 2 个),但我可能总是每张表只使用一个。
PS:我也知道捕获实例名称通常是内置的<schema>_<table>
,但是依靠这个假设似乎有点冒险。未来版本的命名约定可能会发生变化,或者有人可以提供手动捕获实例名称/更改名称。