SQL Server错误4928 - 没有复制或CDC

时间:2015-01-08 06:19:34

标签: sql-server sql-server-2008 sql-server-2008-r2

我正在尝试重命名列,但我收到此错误:

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'

3 个答案:

答案 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,它会在任何地方禁用它,但这些错误一直在发生。

为了克服这个问题,诀窍是:

  1. 在数据库级别激活CDC

    EXECUTE sp_cdc_enable_db GO

  2. 在表格上激活CDC

    EXEC sys.sp_cdc_enable_table @source_schema = N'dbo', @source_name = N'MyTable', @role_name = N'MyRole', @supports_net_changes = 1 GO

  3. 禁用表格上的CDC

    EXEC sys.sp_cdc_disable_table @source_schema = N'dbo', @source_name = N'MyTable', @capture_instance = N'dbo_MyTable' GO

  4. 在数据库级别禁用CDC

    EXECUTE sp_cdc_disable_db GO