关于禁用发布可能出现的问题处理

      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 ' ;

然后在使用禁用的方式

,就可以完成发布订阅的处理了。

原文地址:https://www.cnblogs.com/Gaojier/p/2783535.html