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

来源:互联网 发布:2016年最火的网络用语 编辑:程序博客网 时间:2024/04/29 00:33

      SQL Server在订阅和发布是经常出现一些意想不到的问题,导致发布订阅无法使用,此时经常需要对发布订阅进行删除,笔者经过多次试验,发现直接删除发布和订阅时,经常会出现删除不彻底,表面现象就是因发布订阅而出现的触发器、rowguid列等仍然存在,从而影响数据库的正常使用,这样还需要进一步对数据库处理才能彻底清楚发布和订阅。

      其实在发布和订阅的选项里面,有一个禁用发布,使用此功能,一般会完成发布订阅的处理,也不会有任何的残留,所以提示大家在做发布和订阅的处理时,尽量使用禁用功能,当然,这样处理有时候也会产生一些异常,对于遗留下的触发器、rowguid列的问题,我们可以用一些脚本处理掉,脚本如下:

 

-- drop rowguid indexes

select 'drop index '+ sysobjects.name+ '.' + sysindexes.name from

sysindexes

inner joinsysobjects

on sysindexes.id= sysobjects.id

where objectproperty(object_id(sysobjects.name),'IsMSShipped') = 0

and sysindexes.indid> 0 andsysindexes.indid <255 and (sysindexes.status &

64)=0

and index_col(sysobjects.name, sysindexes.indid, 1) = 'rowguid'

order bysysindexes.indid

 

-- remove rowguid default constraints

select 'alter table '+ b.name + ' drop constraint ' + a.name from

sysobjectsa

inner joinsyscolumns on syscolumns.id = a.parent_obj

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

然后在使用禁用的方式

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

 

原创粉丝点击