我有2台服务器,可以互相访问,2台机器的密码都一样,登陆的用户名都是administrator,到doc下可以运行,copy c:\123.txt \\10.120.148.122\123\ /y,可以拷贝成功,但是用sql数据库里面的xp_cmdshell存储过程,exec   master..xp_cmdshell   'c:\123.txt \\10.120.148.122\123\ /y'   提示拒绝访问,
请高手帮忙,我是不是需要在slq里面设置什么东西呀

解决方案 »

  1.   


    拒绝访问是不是没有写入的权限!use master --必须在master数据库中创建
    goif exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_MoveDb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    drop procedure [dbo].[p_MoveDb]
    GO/*--将一个数据库的数据文件移动到指定的目录--邹建 2004.08(引用请保留此信息)--*//*--调用示例 exec p_MoveDb 'testa','c:\'
    --*/
    create proc p_MoveDb
    @sdbname sysname, --定义要移动的数据库名
    @newpath sysname --存放数据文件的新目录名
    as
    declare @sql varchar(8000),@bpath varchar(8000),@rpath varchar(8000),@s nvarchar(4000)--参数检测
    set @sql=''
    if isnull(@sdbname,'')='' set @sql='必须指定要处理的数据库名'
    if db_id(@sdbname) is null set @sql=@sql+char(13)+'指定的数据库不存在!'
    if isnull(@newpath,'')='' set @sql=@sql+char(13)+'必须指定新的数据库目录'
    if @sql<>''
    begin
    print @sql
    return
    end--生成数据库备份语句,进行数据库备份
    select @bpath=@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 ['+@sdbname
    +'] from disk='''+@bpath+''''+' with file=1,replace'if right(@newpath,1)='\' set @newpath=left(@newpath,len(@newpath)-1)set @s='select @sql=@sql+'',move ''''''+rtrim(name)+'''''' to ''''''+@newpath+rtrim(right(filename,charindex(''\'',reverse(filename))))+'''''''' from ['+@sdbname+']..sysfiles'
    exec sp_executesql @s
    ,N'@sql varchar(8000) out,@newpath sysname'
    ,@sql out,@newpath--关闭用户进程
    declare hCForEach cursor global for
    select s='kill '+cast(spid as varchar) 
    from master..sysprocesses where dbid=db_id(@sdbname)
    exec sp_msforeach_worker '?'--恢复数据库
    exec(@sql)
    go
      

  2.   

    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_MoveDb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) ←这个值是1或0,是cmdshell执行是否成功的关键
    drop procedure [dbo].[p_MoveDb]
    GO
      

  3.   

    应该不支持异地操作,你可以试试建立虚拟盘,看行不行?参考如下异机操作:--SQL如何备份到异机写成存储过程,建立作业定时备份~~~
    --在sql中映射一下就可以了
    exec master..xp_cmdshell 'net use z: \\yizhi\D$ "密码" /user:yizhi\administrator'/*--说明:
    exec master..xp_cmdshell 'net use z: \\xz\c$ "密码" /user:xz\administrator'z:是映射网络路径对应本机的盘符,与下面的备份对应
    \\xz\c$是要映射的网络路径xz\administrator
    xz是远程的计算机名,
    administrator是登陆的用户名
    密码 面指定的administrator用户的密码
    --*/--备份;with init覆盖|noinit添加
    backup database 库名 to disk='E:\H_BACKUP.bak' with init--COPY
    exec master..xp_cmdshell 'copy E:\H_BACKUP.bak z:'--删除(这句可以去掉)
    --exec master..xp_cmdshell 'del E:\H_BACKUP.bak'--完成后删除映射
    exec master..xp_cmdshell 'net use z: /delete'