2013-02-16 184 views
4

我们有一个SQL Server数据库托管在启用了CDC(更改数据捕获)的SQL Server 2008 R2(SP 1)上。将数据库附加到SQL Server 2008 R2实例后,CDC失败

后的SQL Server实例的因许可证到期(部署团队忘记安装正确的许可证:(),我们连接数据库到新安装的实例。

但是重新安装后,CDC为所有表 未启用当我们试图通过执行

sys.sp_cdc_enable_table 

启用它,我们得到

The database 'DBName' is not enabled for Change Data Capture. Ensure that the correct database context is set and retry the operation. To report on the databases enabled for Change Data Capture, query the is_cdc_enabled column in the sys.databases catalog view.

Sugg认为CDC未启用。

所以,我们试图通过执行

sys.sp_cdc_enable_db 

启用它,我们得到了以下错误:

Msg 22906, Level 16, State 1, Procedure sp_cdc_enable_db_internal, Line 49
The database 'DBName' cannot be enabled for Change Data Capture because a database user named 'cdc' or a schema named 'cdc' already exists in the current database. These objects are required exclusively by Change Data Capture. Drop or rename the user or schema and retry the operation.

试图通过执行

sys.sp_cdc_disable_db 

我们得到了禁用CDC后错误再次出现同样的错误:

The database 'DBName' is not enabled for Change Data Capture. Ensure that the correct database context is set and retry the operation. To report on the databases enabled for Change Data Capture, query the is_cdc_enabled column in the sys.databases catalog view.

我的猜测是数据库系统表和导致CDC无效状态的SQL服务器系统表之间存在一些不一致。

有什么办法解决这个问题吗?

任何想法表示赞赏。

回答

4

嗨 修复DB(与疾病预防控制中心的架构和模式本身放弃所有) 使用这样的:

DECLARE @tableName NVARCHAR(100); 
DECLARE myCursor CURSOR FORWARD_ONLY FAST_FORWARD READ_ONLY 
FOR 
    SELECT QUOTENAME(t.name) AS name 
    FROM sys.tables t 
      JOIN sys.schemas s ON t.schema_id = s.schema_id 
    WHERE s.name = 'cdc' 
OPEN myCursor 
FETCH FROM myCursor INTO @TableName 
WHILE (@@Fetch_Status = 0) 
    BEGIN 

     EXEC ('drop table cdc.' + @TableName + '; '); 
     FETCH NEXT FROM myCursor INTO @TableName 
    END 
CLOSE myCursor 
DEALLOCATE myCursor; 
go 

DECLARE @prName NVARCHAR(100); 
DECLARE myCursor2 CURSOR FORWARD_ONLY FAST_FORWARD READ_ONLY 
FOR 
    SELECT QUOTENAME(pr.name) AS name 
    FROM sys.procedures pr 
      JOIN sys.schemas s ON pr.schema_id = s.schema_id 
    WHERE s.name = 'cdc' 
OPEN myCursor2 
FETCH FROM myCursor2 INTO @prName 
WHILE (@@Fetch_Status = 0) 
    BEGIN 
     EXEC ('drop procedure cdc.' + @prName + '; '); 
     FETCH NEXT FROM myCursor2 INTO @prName 
    END 
CLOSE myCursor2 
DEALLOCATE myCursor2 

GO 

DECLARE @fnName NVARCHAR(100); 
DECLARE myCursor3 CURSOR FORWARD_ONLY FAST_FORWARD READ_ONLY 
FOR 
    SELECT QUOTENAME(fn.name) AS name 
    FROM sys.objects fn 
      JOIN sys.schemas s ON fn.schema_id = s.schema_id 
    WHERE fn.type IN ('FN', 'IF', 'TF') 
      AND s.name = 'cdc' 
OPEN myCursor3 
FETCH FROM myCursor3 INTO @fnName 
WHILE (@@Fetch_Status = 0) 
    BEGIN 
     EXEC ('drop function cdc.' + @fnName + '; '); 
     FETCH NEXT FROM myCursor3 INTO @fnName 
    END 
CLOSE myCursor3 
DEALLOCATE myCursor3 
go 
DECLARE @ruleName NVARCHAR(100); 
SELECT @ruleName = DP1.name 
FROM sys.database_principals AS DP1 
     JOIN sys.database_principals AS DP2 ON DP1.owning_principal_id = DP2.principal_id 
WHERE DP1.type = 'R' 
     AND DP2.name = 'cdc'; 
EXEC ('ALTER AUTHORIZATION ON ROLE::'[email protected]+' TO dbo; ') 
go 
DROP SCHEMA [cdc] 
GO 
DROP USER [cdc] 
GO 
+0

工作得很好,只是如果没有规则可言,在我的情况我得到一个NULL,这个语句失败... EXEC('ALTER AUTHORIZATION ON ROLE ::'+ @ ruleName +'TO dbo;') – 2014-03-27 11:09:06

0

我也遇到了处理CDC en/disable的坏道。如果我是你,我会尝试删除cdc模式和模式本身中的所有内容,然后再次尝试在数据库中启用CDC。或者,如果您正在恢复(而不是附加),则有一个KEEP_CDC选项。

相关问题