我正在尝试重命名列,但我收到此错误:
Msg 4928, Level 16, State 1, Procedure sp_rename, Line 547
Cannot alter column 'appraisal_id' because it is 'enabled for Replication or Change Data Capture'.
Msg 0, Level 20, State 0, Line 0
A severe error occurred on the current command. The results, if any, should be discarded.
未配置复制。在某些时候,CDC已在数据库和一些表(包括我正在尝试重命名列的表)上启用,但它目前在数据库上已禁用。我假设它在数据库上被禁用而没有先在每个表上禁用它,这就是导致这个问题。我会说这是一个SQL Server错误。
作为一种解决方法,我可以在数据库上重新启用CDC,在表上禁用它,然后在数据库上禁用它,然后我可以重命名该列。
我正在试图找出哪个表存在这个问题(我们的数据库有3500个表),所以我可以一劳永逸地解决这个问题并在将来避免这种情况。我没有看到任何系统表(我检查过sys.tables,sys.objects,sysobject,sys.columns,syscolumns)中的任何内容,表明该表已启用CDC。所有相关列(is_published,is_schema_published,is_merge_published,is_tracked_by_cdc)的值为0.
知道SQL Server存储此信息的位置吗?
我正在使用SQL 2008和2008 R2;两者都会出现问题。
您可以使用以下脚本重现问题:
CREATE DATABASE TestCDC
GO
USE TestCDC
GO
CREATE TABLE dbo.fish(
fish_id int NOT NULL
, name nvarchar(100) NOT NULL
, CONSTRAINT XPKfish PRIMARY KEY (fish_id))
GO
EXECUTE sp_cdc_enable_db
GO
EXECUTE sys.sp_cdc_enable_table
@source_schema = N'dbo'
, @source_name = 'fish'
, @capture_instance = 'my_capture'
, @role_name = NULL
, @filegroup_name = NULL
GO
EXECUTE sp_cdc_disable_db
GO
EXECUTE sp_rename 'dbo.fish.name', 'fish_name'
答案 0 :(得分:0)
我无法访问启用了CDC的实例来测试此功能,但根据用于启用cdc的内部过程的文本(有用的可访问here),可能是一个或cdc
架构中的更多表格包含信息 - 我建议cdc.change_tables
作为起点。
答案 1 :(得分:0)
在sys.tables中,有两列将告诉您服务器是否认为该表已被复制或启用了cdc(无论这些功能的数据库状态如何)。做ff:
select name, is_tracked_by_cdc, is_replicated
from sys.tables
where is_tracked_by_cdc = 1
or is_replicated = 1
如果其中一个为真,则必须启用有问题的数据库功能(例如CDC),为具有该功能的任何表禁用该功能,然后在数据库级别重新禁用该功能。
答案 2 :(得分:0)
我假设你已经解决了这个问题,但我刚刚再遇到这个问题,也许人们会想在这个问题上找到一个好的答案。
似乎如果你在数据库级别禁用CDC,它会在任何地方禁用它,但这些错误一直在发生。
为了克服这个问题,诀窍是:
在数据库级别激活CDC
EXECUTE sp_cdc_enable_db
GO
在表格上激活CDC
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'MyTable',
@role_name = N'MyRole',
@supports_net_changes = 1
GO
禁用表格上的CDC
EXEC sys.sp_cdc_disable_table
@source_schema = N'dbo',
@source_name = N'MyTable',
@capture_instance = N'dbo_MyTable'
GO
在数据库级别禁用CDC
EXECUTE sp_cdc_disable_db
GO