关于网友提出的“ [SQL SERVER 2008R2]无法对 cdc 执行 drop schema,因为对象 fn_cdc_get_all_changes_ 正引用它”问题疑问,本网通过在网上对“ [SQL SERVER 2008R2]无法对 cdc 执行 drop schema,因为对象 fn_cdc_get_all_changes_ 正引用它”有关的相关答案进行了整理,供用户进行参考,详细问题解答如下:
问题: [SQL SERVER 2008R2]无法对 cdc 执行 drop schema,因为对象 fn_cdc_get_all_changes_ 正引用它
描述:描述:目前有两台主机A和B。在主机A上创建了数据库DB(记为A.DB),并开启了CDC。现将A.DB拷贝至主机B上,搭建为数据库B.DB,并开启了SQL代理。(数据库均为SQL Server 2008r2)
现针对B.DB执行如下SQL:
EXEC sys.sp_changedbowner 'sa'; -- 改变用户权限exec sys.sp_cdc_enable_db; -- 开启数据库 CDC。如果报错,则需要改变用户权限
则出现如下报错:
消息 22906,级别 16,状态 1,过程 sp_cdc_enable_db_internal,第 49 行
因为当前数据库中已存在名为 'cdc' 的数据库用户或名为 'cdc' 的架构,所以无法为变更数据捕获启用数据库 'DB'。变更数据捕获需要独占使用这些对象。请删除或重命名该用户或架构,然后重试相应操作。
而实际上B.DB并未开启CDC。按照提示删除数据库下的cdc架构(删除cdc角色时提示需要先删除架构)

则会出现如下报错:

详细信息如下:
===================================
无法对 'cdc' 执行 dropschema,因为对象 'fn_cdc_get_all_changes_ ... ' 正引用它。 (.Net SqlClient Data Provider)
------------------------------
有关帮助信息,请单击: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=10.50.2500&EvtSrc=MSSQLServer&EvtID=3729&LinkId=20476------------------------------服务器名称: (local)
错误号: 3729
严重性: 16
状态: 1
行号: 2------------------------------程序位置:
在 Microsoft.SqlServer.Management.Common.ConnectionManager.ExecuteTSql(ExecuteTSqlAction action, Object execObject, DataSet fillDataSet, Boolean catchException)
在 Microsoft.SqlServer.Management.Common.ServerConnection.ExecuteNonQuery(String sqlCommand, ExecutionTypes executionType)
本人依据相关线索,在网上搜到如下SQL以查询与架构相关的对象:
-- 查询与架构相关的对象
use DB
goselect obj.type, obj.name
from sys.objects obj join sys.schemas s on(s.schema_id = obj.schema_id)
where s.name ='cdc'go
得到部分查询结果如下:

于是想尝试删除sys.objects表中的相关记录:
deletefrom sys.objects where name ='fn_cdc_get_all_changes_...'go
又出现如下报错信息:
消息 259,级别 16,状态 1,第 1 行
不允许对系统目录进行即席更新。
(注:以上SQL操作均位于B.DB)
本人最终目的是想开启B.DB的CDC,忘高手解惑。不胜感激~
解决方案1:你是怎么拷贝的呢?
以上介绍了“ [SQL SERVER 2008R2]无法对 cdc 执行 drop schema,因为对象 fn_cdc_get_all_changes_ 正引用它”的问题解答,希望对有需要的网友有所帮助。
本文网址链接:http://www.codes51.com/wd/1669457.html