Overview:
There was a database restore from production to UAT and the restore was done without Keep CDC option. When developer asked to enable CDC the following was the error.
Always keep CDC while restore is best option whether we have CDC or not.
use [DB Name] go exec sys.sp_cdc_enable_db
Msg 22906, Level 16, State 1, Procedure sp_cdc_enable_db_internal, Line 49 [batch start line 2]
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.
Solution: Drop all CDC objects and enable CDC again.
use [T] go exec sys.sp_cdc_enable_db -- Remove tables SELECT 'drop table cdc.' + QUOTENAME(t.name) AS name FROM sys.tables t JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE s.name = 'cdc' -- Remove SP SELECT 'drop procedure cdc.' + QUOTENAME(pr.name) AS name FROM sys.procedures pr JOIN sys.schemas s ON pr.schema_id = s.schema_id WHERE s.name = 'cdc' -- Remove functions SELECT 'drop function cdc.' + 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' -- Change AUTHORIZATION schema role SELECT 'ALTER AUTHORIZATION ON ROLE::'+DP1.name+' to DBO' , 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'; -- Remove schema and user go DROP SCHEMA [cdc] GO DROP USER [cdc] GO