SQL Server在订阅和发布是经常出现一些意想不到的问题,导致发布订阅无法使用,此时经常需要对发布订阅进行删除,笔者经过多次试验,发现直接删除发布和订阅时,经常会出现删除不彻底,表面现象就是因发布订阅而出现的触发器、rowguid列等仍然存在,从而影响数据库的正常使用,这样还需要进一步对数据库处理才能彻底清楚发布和订阅。
其实在发布和订阅的选项里面,有一个禁用发布,使用此功能,一般会完成发布订阅的处理,也不会有任何的残留,所以提示大家在做发布和订阅的处理时,尽量使用禁用功能,当然,这样处理有时候也会产生一些异常,对于遗留下的触发器、rowguid列的问题,我们可以用一些脚本处理掉,脚本如下:
-- drop rowguid indexes
select 'drop index ' + sysobjects. name + '.' + sysindexes. name from
sysindexes
inner join sysobjects
on sysindexes. id = sysobjects. id
where objectproperty ( object_id ( sysobjects. name), 'IsMSShipped' ) = 0
and sysindexes. indid > 0 and sysindexes. indid < 255 and ( sysindexes. status &
64)= 0
and index_col ( sysobjects. name, sysindexes. indid, 1) = 'rowguid'
order by sysindexes. indid
-- remove rowguid default constraints
select 'alter table ' + b. name + ' drop constraint ' + a. name from
sysobjects a
inner join syscolumns on syscolumns. id = a. parent_obj
inner join sysobjects b on syscolumns. id = b. id
where syscolumns. name = 'rowguid'
and objectproperty ( object_id ( b. name), 'IsMSShipped' ) = 0
and a. xtype = 'D'
-- remove rowguid columns
select 'alter table ' + sysobjects. name + ' drop column ''rowguid'' ' from
syscolumns
inner join sysobjects on syscolumns. id = sysobjects. id
where syscolumns. name = 'rowguid'
and objectproperty ( object_id ( sysobjects. name), 'IsMSShipped' ) = 0
有时候 ,还会出现一下提示,
“标题: Microsoft SQL Server Management Studio
------------------------------
无 法删除发布“XXXX”。
有关帮助信息,请单击: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=10.0.1600.22&EvtSrc=Microsoft.SqlServer.Management.UI.VSIntegration.ObjectExplorer.Replication.ReplicationMenuItem&EvtID=CantDeletePublication&LinkId=20476
------------------------------
其 他信息:
执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo)
------------------------------
无法作为数据库主体执行,因为主体 "dbo" 不存在、无法模拟这种类型的主体,或您没有所需的权限。
已将数据库上下文更改为 'XXXX'。 (Microsoft SQL Server,错误: 15517 )
有关帮助信息,请单击: http://go.microsoft.com/fwlink?ProdName=Microsoft+SQL+Server&ProdVer=10.00.1600&EvtSrc=MSSQLServer&EvtID=15517&LinkId=20476
其实产生上述问题的主要原因是两方面:
1、可能是因为孤立用户引起的,其处理方式如下:
USE 出问题的库名;
GO
-- 查看孤立用户
EXEC sp_change_users_login ' Report ' ;
GO
-- 修复孤立用户
EXEC sp_change_users_login ' Auto_Fix ' , ' 孤立用户名 ' , NULL , ' 用户密码 ' ;
还有一种情况是因为数据库的owner出现异常引起了 ,解决方案如下:
USE 出问题的库名;
EXEC sp_changedbowner ' sa ' ;
然后在使用禁用的方式
,就可以完成发布订阅的处理了。