sql-server - CDC 功能不显示过去一天的信息
问题描述
我正在使用 SQL Server 2014 (SP2)。
我在一张桌子上启用了 CDC。然后我想查看过去 24 小时内发生的所有事情,所以我使用以下内容:
DECLARE @begin_time DATETIME, @end_time DATETIME, @begin_lsn BINARY(10), @end_lsn BINARY(10);
SELECT @begin_time = GETDATE()-1, @end_time = GETDATE();
SELECT @begin_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than', @begin_time);
SELECT @end_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);
SELECT *
FROM [MyDatabase].cdc.fn_cdc_get_all_changes_dbo_MyTable(@begin_lsn,@end_lsn,'all')
GO
但我不断收到以下错误:
An insufficient number of arguments were supplied for the procedure or function cdc.fn_cdc_get_all_changes_ ... .
但是,上述函数是我启用 CDC 时系统生成的,仅包含 3 个参数:
ALTER function [cdc].[fn_cdc_get_all_changes_dbo_MyTable]
( @from_lsn binary(10),
@to_lsn binary(10),
@row_filter_option nvarchar(30)
)
为什么该功能不起作用?
解决方案
如果指定的 LSN 范围不在捕获实例的更改跟踪时间线内,则函数返回错误 208(“为过程或函数 cdc.fn_cdc_get_all_changes 提供的参数数量不足。”)。
根据这个解释,你可能需要确定@begin_time
和,@end_time
比如你可以根据 CDC 表的 __$start_lsn 来指定开始时间和结束时间。如果您执行以下查询,您将不会遇到错误。
DECLARE @begin_time DATETIME, @end_time DATETIME, @begin_lsn BINARY(10), @end_lsn BINARY(10);
--SELECT @begin_time = GETDATE()-1, @end_time = GETDATE();
SELECT @begin_time=sys.fn_cdc_map_lsn_to_time(MIN(__$start_lsn)) FROM AdventureWorks2017.cdc.dbo_MyTable_CT
SELECT @end_time = sys.fn_cdc_map_lsn_to_time(MAX(__$start_lsn)) FROM AdventureWorks2017.cdc.dbo_MyTable_CT
SELECT @begin_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than', @begin_time);
SELECT @end_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @end_time);
SELECT *
FROM AdventureWorks2017.cdc.fn_cdc_get_all_changes_dbo_MyTable(@begin_lsn, @end_lsn, N'all')
+------------------------+------------------------+--------------+----------------+----+----------+------------+-------------------------+
| __$start_lsn | __$seqval | __$operation | __$update_mask | Id | SomeText | ModifiedBy | ModifiedDate |
+------------------------+------------------------+--------------+----------------+----+----------+------------+-------------------------+
| 0x0000002E000070F80004 | 0x0000002E000070F80003 | 2 | 0x0F | 2 | SomeText | Matt | 2020-02-18 14:38:00.120 |
+------------------------+------------------------+--------------+----------------+----+----------+------------+-------------------------+
推荐阅读
- sql - SQL选择包含间隔中所有值的行
- javascript - 如何使用 POST 值更新我的数据表。ASP.NET
- cucumber - 在黄瓜数据表的步骤定义末尾放置一个冒号 (:) 是一个好习惯吗?
- string - 如何在 Julia 中使用零填充格式化整数?
- python - 当我想将 pygame 1.9.x 安装到 python 3 时发生错误
- javascript - Node.js axios 无错误提示程序停止运行
- javascript - Vue.js 组件嵌入到另一个组件时不会出现
- excel - 工作表和 VBA 中的 INDEX/MATCH 之间的区别
- reactjs - 超过 1 次测试时反应 Jest 测试警告
- android - AudioPlaybackCapture API 的策略不起作用