如何手动禁用表的CDC?

时间:2009-12-03 08:02:31

标签: sql-server cdc

我在禁用CDC之前丢弃了一张桌子。现在,当我重新创建表并尝试启用CDC时,它说捕获实例已经存在。我可以使用不同的捕获实例名称,但需要知道是否还有手动删除关联的捕获实例。

当我通过SSMS GUI删除表时,它也会丢弃CDC表。但这次我使用代码删除了表,它没有禁用或删除CDC。因此麻烦。如果错误地删除了更改表,Ms文档会讨论一个热修复。但我删除了基表。有关如何删除已删除表的捕获实例的任何线索?

3 个答案:

答案 0 :(得分:4)

以下是我在CDC中删除孤立捕获实例的步骤:

DROP FUNCTION [cdc].[fn_cdc_get_net_changes_dbo_(tablename)]
DROP FUNCTION [cdc].[fn_cdc_get_all_changes_dbo_(tablename)]

然后运行以下命令:

declare @objid int
set @objid = (select object_id from cdc.change_tables where capture_instance = 'your orphaned capture instance')

delete from cdc.index_columns where object_id = @objid
delete from cdc.captured_columns where object_id = @objid
delete from cdc.change_tables where object_id = @objid

此时您应该可以正常通过sp_cdc_enable_table重新创建捕获实例。

答案 1 :(得分:1)

嗯,我想出了办法。我从所有CDC系统表中删除了与该表相关的所有记录,并尝试重新创建具有相同名称的捕获实例。它奏效了!

答案 2 :(得分:1)

除了pdanke的REPLY之外,我还要再执行一步:

DROP TABLE cdc.<capture_insance>_CT

当我恢复已启用更改数据捕获的数据库时,我的cdc孤儿可能已经出现。就我而言,

EXECUTE sys.sp_cdc_help_change_data_capture 

导致一个条目source_schemasource_table都是NULL