导航
  • 主页
  • 基础类
  • 应用实例
  • 新技术前沿

删除强制订阅的问题

byj2001329 2003-12-23 10:29:04
发布服务器已停用
要删除订阅服务器的强制订阅,有什么办法
...全文
112 点赞 收藏 12
写回复
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
byj2001329 2003-12-26
感谢大家帮忙,尤其是邹建兄弟。
通过导库的方法可以实现,但我是这样解决的,在订阅服务器上
执行系统存储过程 sp_removedbrepliction 'database name'
建了一个测试用数据库,模拟当前条件,执行时未出错。在正式
数据库上执行报告任务完成,但有错误,但目的实现
回复
/*--

研究了一整天,终于找到了解决的办法.

用下面的存储过程,将你的数据库复制一下,就可以解决问题了.


--用法:
打开查询分析器,将下面的代码复制到查询分析器中,按F5执行.

--然后执行下面的语句来调用:
exec p_CopyDb @sdbname='要删除强制订阅的数据库'
,@ddbname='删除强制订阅后生成的数据库名'


--*/


/*--将一个数据库完整复制成另一个数据库

--邹建 2003.10--*/

/*--调用示例
exec p_CopyDb @sdbname='要删除强制订阅的数据库'
,@ddbname='test'
--*/

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_CopyDb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[p_CopyDb]
GO

create proc p_CopyDb
@sdbname sysname='', --定义要复制的数据库名,默认为当前数据库
@ddbname sysname, --定义复制后生成的数据库名
@overexist bit=1, --是否覆盖已经存在的数据库
@killuser bit=1 --是否关闭用户使用进程,仅@overexist=1时有效
as
declare @sql varchar(8000),@bpath varchar(8000),@rpath varchar(8000)

--得到要复制的数据库名
if isnull(@sdbname,'')='' set @sdbname=db_name()

--得到临时备份数据目录及文件名
select @bpath=rtrim(reverse(filename)) from master..sysfiles where name='master'
select @bpath=substring(@bpath,charindex('\',@bpath)+1,8000)
,@bpath=reverse(substring(@bpath,charindex('\',@bpath),8000))+'BACKUP\'
+@sdbname+'_'+convert(varchar,getdate(),112)
+'_'+replace(convert(varchar,getdate(),108),':','')
+'.bak'

--生成数据库备份语句,进行数据库备份
set @sql='backup database '+@sdbname
+' to disk='''+@bpath
+''' with NOINIT'
exec(@sql)

--根据备份文件恢复成新的数据库(完成复制工作)
set @sql='restore database '+@ddbname
+' from disk='''+@bpath+''''
+' with file=1'
+case when @overexist=1 then ',replace' else '' end

--得到数据库存放的默认目录
--得到SQL安装时设置的数据文件路径
select @rpath=rtrim(reverse(filename)) from master..sysfiles where name='master'
select @rpath=reverse(substring(@rpath,charindex('\',@rpath),8000))

--添加移动逻辑文件的处理
--从备份文件中获取逻辑文件名
declare @lfn nvarchar(128),@tp char(1),@i int

--创建临时表,保存获取的信息
create table #tb(ln nvarchar(128),pn nvarchar(260),tp char(1),fgn nvarchar(128),sz numeric(20,0),Msz numeric(20,0))
--从备份文件中获取信息
insert into #tb exec('restore filelistonly from disk='''+@bpath+'''')
declare #f cursor for select ln,tp from #tb
open #f
fetch next from #f into @lfn,@tp
set @i=0
while @@fetch_status=0
begin
select @sql=@sql+',move '''+@lfn+''' to '''+@rpath+@ddbname+cast(@i as varchar)
+case @tp when 'D' then '.mdf''' else '.ldf''' end
,@i=@i+1
fetch next from #f into @lfn,@tp
end
close #f
deallocate #f

--关闭用户进程处理
if @overexist=1 and @killuser=1
begin
declare @spid varchar(20)
declare #spid cursor for
select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@ddbname)
open #spid
fetch next from #spid into @spid
while @@fetch_status=0
begin
exec('kill '+@spid)
fetch next from #spid into @spid
end
close #spid
deallocate #spid
end

--恢复数据库
exec(@sql)

--删除备份的临时文件
set @sql='del "'+@bpath+'"'
exec master..xp_cmdshell @sql,no_output
select @sql,@bpath,@rpath
go
回复
研究了一天,发现只能在发布服务器删除订阅才行.

正在找通过修改系统表的方法.
回复
byj2001329 2003-12-23
现在sql服务器的禁用属性已无效,已不是发布和分发服务器了
但修改表结构时仍提示因分发合并无法修改
诸位大侠帮帮忙,再想想
回复
byj2001329 2003-12-23
用的是合并发布
用企业管理器->服务器->属性->复制->禁用 后
仍然不能修改表结构
忘了说,我的目的是修改表结构

回复
byj2001329 2003-12-23
是在订阅服务器上做吗?
回复
同意楼上.
回复
txlicenhe 2003-12-23
企业管理器->服务器->属性->复制->禁用
回复
byj2001329 2003-12-23
up
回复
byj2001329 2003-12-23
up
回复
byj2001329 2003-12-23
up
回复
hglhyy 2003-12-23
约束
回复
发动态
发帖子
MS-SQL Server
创建于2007-09-28

3.2w+

社区成员

MS-SQL Server相关内容讨论专区
申请成为版主
社区公告
暂无公告